Nei*_*eil 7 .net c# generics inheritance
我正在使用保险,有两种不同的政策类型 - 汽车和家用,由两个不同的类别,汽车和家庭代表.
两者都有几个共同的数据位,因此两者都将从另一个名为Policy的类继承.当用户登录应用程序时,他们可能有电机或家庭政策,因此应用程序需要显示通用信息以及Motor或Household独有的信息.为了封装所有这些,我有一个具有Motor成员和Household成员的响应对象,如下所示:
public class Response
{
...
private MotorPolicy _motorPolicy;
private HouseholdPolicy _householdPolicy;
....
}
Run Code Online (Sandbox Code Playgroud)
以下代码应证明:
if (response.PolicyType == Enumerations.PolicyType.Motor)
{
lblDescription.Text = response.MotorPolicy.Description;
lblReg.Text = response.MotorPolicy.Reg;
}
else
{
lblDescription.Text = response.HouseholdPolicy.Description;
lblContents.Text = response.HouseholdPolicy.Contents;
}
Run Code Online (Sandbox Code Playgroud)
MotorPolicy没有Contents属性,而HouseholdPolicy没有Reg属性.
但我真的想干脆做到:
if (response.PolicyType == Enumerations.PolicyType.Motor)
{
lblDescription.Text = response.Policy.Description;
...
}
Run Code Online (Sandbox Code Playgroud)
我试过使用泛型,找不到合适的解决方案.
您的响应只需要一个Policy类型,然后您可以将MotorPolicy或HouseholdPolicy类型存储到其中.
然后您的响应只需要检查数据类型
if (response.Policy is MotorPolicy) ....
Run Code Online (Sandbox Code Playgroud)
或者,有一个抽象方法或属性从Policy类型的抽象方法返回数据,该方法完全由子类提供,并将reg数据或内容数据作为apporpriate返回.
每个政策后代(现在你有两个,未来可能有更多,对吗?)应该有自己的UI控件,"知道"如何处理政策信息.同样的方法可以用于其他事情,例如策略对象的"控制器"等.
然后可以使响应变得通用:
public class Response<T> where T: Policy {
...
private T _policy;
....
}
Run Code Online (Sandbox Code Playgroud)
或者,你可以有一个更通用的方法,它使用反射来显示信息,但是它们的外观和可用性通常不那么"性感"(想想VS设计师中的Property Grid).
定义策略接口并在两个策略类中实现它
Interface IPolicy{
int Reg {get;set;};
string Contents {get;set;};
}
MotorPolicy : Policy,IPolicy {
string IPolicy.Contents
{get;set;};
int IPolicy.Reg
{get;set;};
}
HouseholdPolicy : Policy , IPolicy {
string IPolicy.Contents
{get;set;};
int IPolicy.Reg
{get;set;};
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
449 次 |
最近记录: |