2

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

IE

class Field{//some properties} 

class DecimalField : Field {...}

class AccountField : Field {...}

然后我有另一个类Data,它的成员属性为 type Field

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

我必须做什么?我必须使用哪种模式?

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

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

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

于 2012-06-18T12:34:07.820 回答
0

在您的 Data 类中,不要将您的字段声明为 Field,而是酌情使用 DecimalField 或 AccountField。

于 2012-06-18T12:34:51.920 回答
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 回答