我有一个班级Field
,其中有两个子类AccountField
和DecimalField
。
即
class Field{//some properties}
class DecimalField : Field {...}
class AccountField : Field {...}
然后我有另一个类Data
,其成员属性类型为Field
。
但它有问题。如果我将DecimalField
变量分配给Field
中的Data
属性,那么我就不能使用DecimalFields
的某些属性,也不能使用Accountfield
个变量... < / p>
我该怎么办?我必须使用哪种模式?
我正在使用C#4.0和MS Studio 2010
答案 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);
}