一个很典型的设计问题,真心求解,谢谢
结构如下:
public class AView
{
public A A;
public virtual void Show(){ //显示A
}
}
public class AViewChild : AView
{
public Achild B;
public override void Show(){ //显示AChild
}
}
public class A
{
}
public class Achild : A
{
}
总感觉这个结构很不爽,但我现在能想到的解决方法只是能下面这种:
public class AView
{
public A A; //只保留这个
public virtual void Show(){ //显示A
}
}
public class AViewChild : AView
{
public override void Show(){
Achild test = A as AChild //强制转为Achild
}
}
------解决方案--------------------因为看不出AView存在的必要性,所以再精简的话,就这样了:
public class A
{
public virtual void Show(){ //显示A
}
}
public class AChild : A
{
public override void Show(){
}
}
------解决方案--------------------额,不知道你要干啥,所以就事论事的写
public class AView<T>
where T:A
{
public T A;
public virtual void Show(){ //显示A
}
}
public class AViewChild : AView<Achild>
{
public override void Show(){
//此处不用转换了,A字段已经是Achild类型了
}
}
------解决方案--------------------
看lz的需求了,这样写严格来说AViewChild和AView没有继承关系了。
------解决方案--------------------如果你的 A、B 都是垃圾属性,仅仅“为了胡乱聚合而任意耦合在一起”,那么就如 #1 楼所示的,阉割了它就行了。
------解决方案--------------------我好像明白你的意识,其实你该使用接口来解决。
抽象出共用的A方法,也可以同时抽象出Aview类的共用接口。
IAVIEW:IA
然后 public class AViewChild:IAview
{
}
另外,不要使用多层继承。你需要反思下,你的AView是否和A的补充说明类,如果是,你得考虑下,是不是你分的太细了。
如果实在不行,那么需要考虑下能否抽象出一个基类+接口的设计。(个人推荐!)
如: public class AviewChild:A,IAView
{
}
A作为基类,提供基础实现了的方法,IAView作为接口,补充相关额外方法。
我想,你应该想要的,就是着这种设计。