A.R*_*.R. 23 c# oop abstract-class interface
最近我在一些代码中遇到了一个奇怪的模式.我们知道所有事情都有时间和地点,特别是在涉及ABC和接口问题时,但这对我来说似乎是多余的.
// This describes a person....
public interface IPerson
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int BasePay { get; set; }
public string Address { get; set; }
}
// And so does this, but it also uses the interface....
public abstract class Person : IPerson
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int BasePay { get; set; }
public string Address { get; set; }
}
// This uses both ?!
public class CoalMiner : Person, IPerson
{
public CoalMiner()
{
BasePay = 10000;
}
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以想到使用两者和ABC以及定义相同成员的界面的具体优势是什么?
Ree*_*sey 17
就个人而言,我觉得使用界面来描述一个"名词",比如一个人,它通常是一个糟糕的设计选择.
接口应该用于合同 - 所有人总是一个Person,所以抽象类在这里更有意义.可以为附加到特定类型的人的行为添加接口,或者允许Person通过履行合同以某种方式使用接口(即:)Person : IComparable<Person>.
Joe*_*ant 11
只要您在接口而不是基类下传递对象,同时具有IPerson接口和Person基类允许您具有某些自由.IPersonPerson
基类倾向于实现应该由该基类的所有后代使用的公共代码.如果这就是你想要的那样,那很好,但是可能会遇到IPerson需要完全不同的实现的情况,其中Person根本不使用基类.现在你有两个IPerson共同的类层次结构,但事情仍然有效.你不能只用那样做Person.
总是有一个接口冗余的另一个好理由是COM互操作.
接口和 ABC 都有意义的情况是在使用装饰器模式时。ABC 用于为不同的具体实现类提供通用的实现代码。所有的实现类可能都是从 ABC 派生的。
包装现有实例并调整其功能的装饰器通常仅实现接口而不是从 ABC 派生。如果有很多装饰器,可能会有另一个 ABC 提供装饰器所需的通用组合处理和函数调用转发。
明确提及界面有时会使其更具可读性。MSDN 文档经常这样做,例如显示List<>实现两者ICollection<>和IList<>虽然IList<>是从ICollection<>.
| 归档时间: |
|
| 查看次数: |
6636 次 |
| 最近记录: |