同僚と私は、基本クラスとインターフェイスの関係について異なる意見を持っています。インターフェイスの実装が必要なときにそのクラスを使用できる場合を除き、クラスはインターフェイスを実装すべきではないと考えています。言い換えれば、私はこのようなコードを見たい:
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
、ダイヤモンドの継承の問題が発生します(この場合、両者はWork
メソッドの契約を満たします)。Javaでは、インターフェイスのメソッドを実装する必要があるWork
ため、プログラムが使用するメソッドの問題は回避されます。ただし、C ++などの言語では、これが明確になります。