2

Field2つのサブクラスとが存在するクラスがAccountFieldありDecimalFieldます。

すなわち

class Field{//some properties} 

class DecimalField : Field {...}

class AccountField : Field {...}

Data次に、タイプがのメンバープロパティを持つ別のクラスがありますField

しかし、問題があります。内のプロパティにDecimalField変数を割り当てると、の一部のプロパティを使用できず、変数にも同じ です...FieldDataDecimalFieldsAccountfield

私は何をしなければなりませんか?どのパターンを使用する必要がありますか?

C#4.0とMSStudio2010を使用しています

4

6 に答える 6

2

一般的な、または抽象的なアプローチは次のとおりです。

  • 子クラスでオーバーライドできる仮想関数/プロパティを使用して、共通のジェネリッククラスを作成します。
  • そして、指定されたタイプに厳密に実現されているため、一般化できない子クラスのメンバーについては、cast
于 2012-06-18T12:33:30.127 に答える
2

はい、できます。

このようなフィールドクラスがあるとしましょう

public class Field
{
   public string Property1{get;set;}
   public int Property2 {get;set;}
}

そして、このような小数フィールドクラス

  public class DecimalField:Field
   {
    public int DecimalFieldProperty {get;set;}
}

、そして Accountfield はこのように

public class AccountField:Field
    {
       public double Balance{get;set;}
}

、DoSomething というメソッドがあるとします。このメソッドは、以下のようなFieldタイプのパラメーターを想定しています。

void DoSomething(Field field)
{}

次に、具体的な型を渡すには、次のようなことができます

    void DoSomething(Field field)
    {
        var decimalField = field as DecimalField;

        //Do something with the decimal field instance
        if(decimalField  !=null)
         {
           Console.WriteLine("Decimal Field Property {0}",decimalField .DecimalFieldProperty );
          return;

        }

        //Cast the field as a account field instance
      var accountField = field as AccountField;
       if(accountField !=null)
       {
         Console.WriteLine("Balance {0}", accountField.Balance );

        return;
      }

      //Do something else with the normal field
    Console.WriteLine("Normal Field");

    }
于 2012-06-18T12:44:19.573 に答える
1

DecimalField と AccountField の両方のタイプのプロパティを使用する場合、これらのプロパティは Field タイプにする必要があります。

DecimalField のみが認識するプロパティを使用する場合は、Field を DecimalField にキャストする必要があります。

Data data = new Data();
data.Field = new DecimalField();
Field field = data.Field;
DecimalField df = data.Field as DecimalField;
if(df != null)
{
    // use df
}
于 2012-06-18T12:35:25.700 に答える
0

これはうまくいきません:

Field field = myData.Fields[0];
Console.Writeline(field.Name); //assuming Name only exists in AccountField

ただし、フィールドが AccountField の場合は、参照変換を実行して、AccountField 固有のプロパティを使用できます。

if(myData.Fields[0] is AccountField)
{
    var acctField = (AccountField)myData.Fields[0];
    Console.Writeline(acctField.Name);
}
于 2012-06-18T12:49:11.937 に答える
0

Data クラスでは、フィールドを Field として宣言しないでください。必要に応じて DecimalField または AccountField を使用してください。

于 2012-06-18T12:34:51.920 に答える
0

ポリモーフィズムは実際にはパターンではありませんが、はい、説明したとおりに正しく機能します。DecimalField を Field 型の変数に割り当てると、Field のプロパティのみを使用できます。DecimalField のプロパティが必要な場合は、DecimalField に戻す必要があります。

于 2012-06-18T12:34:07.820 に答える