日期:2014-05-20  浏览次数:20757 次

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



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