1

私の最初のインターフェースベースのプログラミング時間と、インターフェースの設計方法に関するいくつかの混乱。

次のように、2つのノード間の関係のインターフェイスを作成しました。

public interface IOWLRelation
{
    IOWLRelation AddSubClass(IOWLClass parent, IOWLClass child);
}

次に、次のように、このインターフェイスを実装するためのクラスを作成しました。

class OWLRelation: IOWLRelation
{
    public OWLClass Parent { get; set; }
    public OWLClass Child { get; set; }

    public IOWLRelation AddSubClass(IOWLClass parent, IOWLClass child)
    {
        this.Parent = (OWLClass) parent;
        this.Child = (OWLClass) child;
        return this;
    }

}

まず第一に、私がこれらのクラスとインターフェースを宣言した方法に悪い習慣があると思いますか?今、私の混乱は、クラスで定義した2つのパブリックプロパティについてです。インターフェイスでもそれらを定義する必要がありますか?また、このクラスに列挙型メンバーを追加したい場合はどうなりますか?クラスに追加するものは何でも、そのインターフェイスにも追加する必要がありますか?

メソッドの実装でさらに重要なのは、そのメソッドのパラメーターにインターフェイスを渡すことです。それは悪いですか、それとも正しいですか?インターフェイスを渡す必要がありますか、それとも実際のクラスを渡す必要がありますか?

4

3 に答える 3

1

IOWLRelation から継承する他のクラスにも親/子が必要な場合は、インターフェイスでこれらのプロパティも定義します (その場合、インターフェイスの名前をより一般的な名前に変更することができます)。

インターフェイスでは、継承されたクラスに(少なくとも)持たせたいすべてのプロパティ/メソッドを定義する必要があります。

インターフェイスを渡すことはまったく問題ありません。インターフェイスがより一般的であるため、実際には実際のクラスよりも優れている可能性があります。

于 2012-08-07T16:23:06.760 に答える
1

この場合、私はあなたの実装を少し異なる方法で行います。あなたのインターフェイスを使用する誰かのワークフローを考えてみると、少し混乱します。最初に OWLRelation オブジェクトを作成し、次に AddSubClass メソッドを呼び出す必要があります。これは、作成済みのオブジェクトを返すだけです。代わりにファクトリ メソッドを使用します。

public interface IOwlRelation
{
    OwlClass Parent { get; }
    OwlClass Child { get; }
}

public class OwlRelation : IOwlRelation
{
    public OwlClass Parent { get; private set; }
    public OwlClass Child { get; private set; }

    public static IOwlRelation Create(OwlClass parent, OwlClass child)
    {
        return new OwlRelation
        {
            Parent = parent,
            Child = child
        };
    }
}

Create メソッドは静的であるため、インスタンスを取得するためだけにインスタンスを作成する必要はありません。また、Parent クラスと Child クラスはインターフェイスからは読み取り専用ですが、クラス内から設定できます。これは一般に、プロパティが後で上書きされないようにするための良い方法ですが、必ずしもそのようにする必要はありません。また、頭字語であっても通常のキャメル ケーシングを使用するようにクラスの名前を変更しました。これは、C# の命名標準の一部であるためです。

于 2012-08-07T16:32:26.007 に答える
1

消費される方法に応じてインターフェイスを考えてください。呼び出し元が親または子について知りたい場合は、それをインターフェイスで公開する必要があります。それらが単なる実装の詳細である場合は、インターフェイスに含めないでください。

インターフェイスの使用方法にすべて依存するため、これらについて厳密な規則はありません。

AddSubClass、常にパラメータを にキャストしている場合は、それOWLClassが呼び出し元にとって意味があるかどうかを検討する必要があるかもしれません。の2つの異なる実装を渡すことで、それを呼び出そうとするでしょうIOWLClassか? これを行うと、キャストは例外をスローします。それは受け入れられますか?

于 2012-08-07T16:34:15.267 に答える