我应该用于一般领域的模式是什么?

时间:2012-06-18 12:30:33

标签: c# .net oop

我有一个班级Field,其中有两个子类AccountFieldDecimalField

class Field{//some properties} 

class DecimalField : Field {...}

class AccountField : Field {...}

然后我有另一个类Data,其成员属性类型为Field

但它有问题。如果我将DecimalField变量分配给Field中的Data属性,那么我就不能使用DecimalFields的某些属性,也不能使用Accountfield个变量... < / p>

我该怎么办?我必须使用哪种模式?

我正在使用C#4.0和MS Studio 2010

6 个答案:

答案 0 :(得分:2)

一般抽象方法是:

  • 使用可在子类中重写的虚函数/属性创建公共泛型类。
  • 以及严格对指定类型进行了操作的子类成员,因此无法推广,请创建cast

答案 1 :(得分: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");

    }

答案 2 :(得分: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
}

答案 3 :(得分:0)

多态性不是真正的模式,但是,它可以按照您描述的方式正确工作。如果将DecimalField分配给Field类型的变量,则只能使用Field的属性。 如果您需要DecimalField的属性,则需要将其转换回DecimalField。

答案 4 :(得分:0)

在Data类中,不要将字段声明为Field,而是根据需要使用DecimalField或AccountField。

答案 5 :(得分: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);
}