读书人

一个很典型的设计有关问题真心求解

发布时间: 2013-11-26 22:51:31 作者: rapoo

一个很典型的设计问题,真心求解,谢谢
结构如下:
一个很典型的设计有关问题,真心求解,多谢


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类型了
}
}



[解决办法]
引用:
额,不知道你要干啥,所以就事论事的写

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作为接口,补充相关额外方法。
我想,你应该想要的,就是着这种设计。

读书人网 >.NET

热点推荐