21

私はC#のこの「機能」に出くわしました-インターフェイスメソッドを実装する基本クラスはそれから派生する必要はありません

例:

public interface IContract
{
    void Func();
}

// Note that Base does **not** derive from IContract
public abstract class Base
{
    public void Func()
    {
        Console.WriteLine("Base.Func");
    }
}

// Note that Derived does *not* provide implementation for IContract
public class Derived : Base, IContract
{
}

何が起こるかというと、Derived魔法のようにパブリックメソッドをピックアップし、Base.Funcそれを実装することを決定しますIContract.Func

この魔法の背後にある理由は何ですか?

IMHO:この「準実装」機能は非常に直感的ではなく、コードの検査をはるかに困難にします。どう思いますか?

4

2 に答える 2

35

その理由は、あなたのコメントが単に間違っているからです。

//DerivedはIContractの実装を提供しないことに注意してください

確かにそうです。ロジックに従ってください。

  • 派生は、IContractの各メンバーに対応するパブリックメンバーを提供する必要があります。
  • 基本クラスのすべての継承可能なメンバーは、派生クラスのメンバーでもあります。それが継承の定義です。
  • したがって、DerivedはIContractの実装を提供します。その継承されたメンバーは、要件を満たすメンバーです
  • したがって、エラーは発生しません。

この機能は非常に直感的ではなく、コードの検査をはるかに困難にします。どう思いますか?

この機能が気に入らない場合は、使用しないでください。この機能を使用するコードを読むのが混乱して奇妙だと感じた場合は、この機能を使用する同僚にそうするのをやめるように勧めてください。

この機能は、基本クラスのメソッドが派生クラスから使用される他の機能とどのように異なりますか?基本クラスのメソッドを派生クラスで使用または参照する方法はいくつかあります。メソッド呼び出し、オーバーライド、メソッドグループ変換などです。

さらに、これは比較的単純で単純なケースです。C#でのインターフェイスのセマンティクスの混乱について本当に不満を言う場合は、インターフェイスの再実装のセマンティクスについて不平を言うことに時間を費やします。それは本当に人々の麺を焼くように見えるものです。セマンティクスが正しく行われていることを確認するために、常に仕様でそのことを調べる必要があります。

于 2010-05-31T15:15:59.380 に答える
12

なぜこれが奇妙で不自然だと思いますか?基本クラスのすべてのパブリックメンバーは、派生クラスのパブリックメンバーでもあります。したがって、ここに矛盾はありません。とにかく、必要に応じて明示的にインターフェイスを実装できます。

于 2010-05-31T10:06:03.180 に答える