我和我的同事对基类和接口之间的关系有不同的看法。我相信一个类不应实现接口,除非在需要实现接口时可以使用该类。换句话说,我喜欢看这样的代码:
interface IFooWorker { void Work(); }
abstract class BaseWorker {
... base class behaviors ...
public abstract void Work() { }
protected string CleanData(string data) { ... }
}
class DbWorker : BaseWorker, IFooWorker {
public void Work() {
Repository.AddCleanData(base.CleanData(UI.GetDirtyData()));
}
}
DbWorker是获得IFooWorker接口的对象,因为它是该接口的可实例化实现。它完全履行了合同。我的同事更喜欢几乎相同的东西:
interface IFooWorker { void Work(); }
abstract class BaseWorker : IFooWorker {
... base class behaviors ...
public abstract void Work() { }
protected string CleanData(string data) { ... }
}
class DbWorker : BaseWorker {
public void Work() {
Repository.AddCleanData(base.CleanData(UI.GetDirtyData()));
}
}
基类在何处获得接口,因此,基类的所有继承者也都属于该接口。这给我带来了麻烦,但是我无法提出具体的原因,为什么“基类不能独立实现接口的实现”。
他的方法与我的方法有什么优缺点,为什么要在另一个方法上使用一个方法?
Work
钻石继承问题是使用称为的相同方法继承BaseWorker和IFooWorker (在这种情况下,它们都在该Work
方法上履行了合同)。在Java中,您需要实现接口的方法,这样Work
可以避免程序应使用哪种方法的问题。但是,诸如C ++之类的语言不会为您消除歧义。