33

私は次のコードレイアウトの読書フォーラムや他のブログ投稿を見て、いくつかの質問をするために適応しました。

public interface IService<T>
{
    int Add(T entity);
    void Update(T entity);
}

public abstract class ServiceBase<T> : IService<T>
{
    public int Add(T entity) { ... }
    public void Update(T entity) { ... }
}

public interface ICarService : IService<Car>
{
}

public class SomeBaseClass : ServiceBase<Car>, ICarService
{
    public int Add(Car entity);
    public void Update(Car entity);
}

私が理解していないのは、抽象クラスがインターフェースを実装することの利点です。私にはそれが少し繰り返し感じられ、抽象クラスがインターフェースを実装することの利点を理解できません。

  1. ServiceBase<T>IServiceインターフェースを継承せずに、抽象クラスをそのまま定義しないのはなぜですか?これはコードを2倍にしますか?
  2. なぜSomeBaseClassまた実装する必要がありICarServiceますか?ServiceBaseで十分ではありませんか?
4

1 に答える 1

39

広告1:追加の抽象基本クラスを使用すると、実装を中断することなくインターフェースを進化させることができます。抽象基本クラスがなく、インターフェイスを拡張するとします。たとえば、新しいメソッドを追加します。その後、クラスがインターフェースを実装しなくなったため、実装が壊れました。

追加の抽象基本クラスを使用して、これを分離できます。インターフェイスに新しいメソッドを追加すると、基本クラスに仮想実装を提供でき、すべてのサブクラスを同じままにして、新しいものと一致するように採用できます。後の時点でのインターフェース。

さらに、この組み合わせにより、(インターフェースを使用して)コントラクトを定義し、(抽象基本クラスを使用して)いくつかのデフォルトのメカニズムを提供できます。デフォルトで問題がない人は誰でも、抽象基本クラスから継承できます。細部について非常に細かく制御したい人は誰でも、インターフェースを手動で実装できます。

広告2:技術的な観点から、最終クラスにインターフェースを実装する必要はありません。しかし、これもまた、物事を互いに別々に進化させることを可能にします。ACarServiceは確かにですService<Car>が、それ以上かもしれません。たぶん、CarService必要なのは、共通のインターフェースにもサービス基本クラスにも入れてはならないいくつかの追加のものだけです。

そういうわけだと思います;-)

于 2012-12-30T15:24:34.583 に答える