C#类继承

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)

我试过使用泛型,找不到合适的解决方案.

Chr*_*sBD 5

您的响应只需要一个Policy类型,然后您可以将MotorPolicy或HouseholdPolicy类型存储到其中.

然后您的响应只需要检查数据类型

if (response.Policy is MotorPolicy) ....
Run Code Online (Sandbox Code Playgroud)

或者,有一个抽象方法或属性从Policy类型的抽象方法返回数据,该方法完全由子类提供,并将reg数据或内容数据作为apporpriate返回.


Luc*_*ero 5

每个政策后代(现在你有两个,未来可能有更多,对吗?)应该有自己的UI控件,"知道"如何处理政策信息.同样的方法可以用于其他事情,例如策略对象的"控制器"等.

然后可以使响应变得通用:

public class Response<T> where T: Policy {
    ...
    private T _policy;
    ....
}
Run Code Online (Sandbox Code Playgroud)

或者,你可以有一个更通用的方法,它使用反射来显示信息,但是它们的外观和可用性通常不那么"性感"(想想VS设计师中的Property Grid).


Ram*_*Vel 0

定义策略接口并在两个策略类中实现它

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)

  • 这并不是我真正理解好的面向对象设计的方式。家庭保单没有注册号码,汽车保单没有内容。因此该设计具有误导性 (3认同)
  • 他有一个名为 Policy 的基类,使用接口不会改变任何内容。 (2认同)