Kin*_*sin 6 c# inheritance abstract-class design-patterns dry
我在使用正确的继承链时遇到了问题,而没有丢失DRY原则的优点.
鉴于以下结构:
现在,我需要有两个共享相同功能的新类.但是一个是A类,而另一个是B类.(这不能改变!)两个类都应该有一个方法SetSize().
所以最后会有C类:A和D:B,两者都有相同的SetSize方法.
问题:如何创建基类中间层以使SetSize()-method仅声明/实现一次(DRY)?我想有关使用接口或一些静态助手类来实现逻辑的东西SetSize()?
是否有任何模式或最佳实践来实现此行为?
在 C# 中不能通过继承来做到这一点,因为它不支持多重继承;该语言为您提供的用于此场景的工具是接口:
public interface
{
void SetSize(Size size);
}
public SizableA: A, ISizable { ... }
public SizableB: B, ISizable { ... }
Run Code Online (Sandbox Code Playgroud)
还要记住,当继承链中的类型具有 is关系(a Catis an Animal、 a Bis anA等)时,应该使用继承,而当完全不相关的类具有非常具体的共同行为时,首选接口;IEquatable、IComparable、IDisposable等。您的SetSize行为似乎更适合最后一类,因为它似乎不是特定于A或 的功能B。
现在,如果 和SizableA应该SizableB共享相同的实现,SetSize那么最好的解决方案是使用组合或简单地委托功能:
public interface ISizable
{
void SetSize(Size size, ISetSizeProvider provider); //Alternatively inject provider in SizableA and SizableB's constructor to get composition.
}
Run Code Online (Sandbox Code Playgroud)