3

私は次のような状況にありますが、何か間違ったことをしているような気がします... ここに画像の説明を入力

この投稿にFieldよると、インターフェイスを使用しました。インターフェイスはクラスから継承し、Field1、2 、および 3 はインターフェイスから継承します。それぞれ独自のスタイルを持ついくつかの異なるタイプのフィールドを持つオブジェクトを構築したいと考えています。特にコンパイルしようとすると次のエラーが発生するため、このように正しい方法で実行しているかどうかはわかりません。FieldStyleFieldLabelType 'Style' in interface list is not an interface

私のコード:

public interface Field : Style
{
    int Xpos { get; set; }
    int Ypos { get; set; }
    int Zindex { get; set; }
}

これを解決する最善の方法は何ですか?

編集

インターフェイスからクラスを継承することは不可能であることはわかっていますが、ここでの最善のアプローチは何でしょうか?

4

4 に答える 4

0

あなたが苦労しているのは、インターフェースの目的だと思います。インターフェイスは、クラスの実装クラスに存在するパブリック メンバーとメソッドを定義します。これにより、型 (インターフェイス名) の変数を作成し、インターフェイスを実装するインスタンス化されたクラスの値を割り当てることができます。

設計を改善する限り、3 つのプロパティ (x、y、z) をインターフェイスとラベル クラスで定義し、フィールド インターフェイスを実装できます。フィールドのリストはありませんが、それを実装して、draw メソッドでプロパティ x、y、および z を持つように強制します。スタイルにはフィールドのリストがあり、フィールド インターフェイスを実装するものはすべてこのリストに追加できます。次に、このリストを自信を持って反復処理し、draw を呼び出して、draw が実際に何を行うかに関係なく、そこにあることを知ることができます。

于 2016-09-13T14:21:10.300 に答える
0

言われているように、インターフェイスはクラスを拡張できないので、別のパターンを試してみます。それがかなり標準的かどうかはわかりませんが、同様のシナリオになると、「インターフェイス + 基本クラス」パターンを選択します。以下を定義します。

  • 必要最小限のフィールド/メソッドを備えたインターフェース
  • 共通の機能を持つベース (オプションで抽象) クラス

そうすれば、機能を追加したいときに、基本クラスを拡張するか、インターフェイスを最初から実装するかを選択できます。

あなたの場合、可能な拡張の方向に依存しますが、構造の例は次のようになります。

  • IStyle インターフェイス
  • IStyle を実装し、抽象 Draw メソッドを使用する StyleBase 抽象クラス
  • IStyle を拡張する IField インターフェイス
  • IField を実装し、抽象 Draw メソッドを使用する FieldBase 抽象クラス
  • StyleBase を拡張し、List を使用する Label クラス
  • FieldBase を拡張する Field1、Field2、Field3 クラス

先ほど言ったように、これは単なる例であり、潜在的な拡張ポイントによって異なります。

于 2016-09-13T14:24:37.890 に答える