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

OOP基类和子类在设计模式中遇到的难题!求解
在项目中,往往会遇到这样的问题,基类下面的某些子类会有扩展的方法,那么,该不该把这些子类的方法提升到基类里面去呢?(如果提升到基类,其他子类并不需要继承,导致其他子类都可以访问本属于某一个子类固有的方法)

如果不提升的话,那么 new 基类().方法
是无法获取的,如果 new 子类().方法是可以访问,但是,就破坏了基类的作用( 我希望都这样 子类 转换为基类对象)。

目前对这样的设计很困惑。

class base{

void A子类固定有();
void 通用();
}

这样会出现 比如B:base  new B().A子类固定。。();

很多时候希望的效果是 Context( base 基类对象).某方法();
【此次的基类对象都是由子类转换过来的】

------解决方案--------------------
又是一个玩设计模式走火入魔的家伙

在现有的net框架下,至少由1/3将被抛弃和改写

你这个要求直接泛型加约束即可。
------解决方案--------------------
如果不提升的话,那么 new 基类().方法
是无法获取的,如果 new 子类().方法是可以访问,但是,就破坏了基类的作用( 我希望都这样 子类 转换为基类对象)。

如果你想让所有子类长的都和基类一样,只是具体实现有差别,那就一定要放到基类里去。
你想让所有东西长的一样,又想让其中一些不一样,你不觉得自己的这两个需求是矛盾的吗?
------解决方案--------------------
你说了好几次“转换”这个词。但是代码
A a= new B();

这叫做转换?多态跟转换不是对等的概念。转换有各种各样的解释,例如代码
X x= (X)a;
这可能只是你的“脆弱的心灵”才会梦到有什么转换,而a变量所引用的对象可能本来就是实例化为X类型的对象实例,只不过是使用声明为A类型的变量引用而已。

这里边根本没有什么实质的“转换”,所谓转换只是在名义上的(运行时会检查“到底a所引用的对象能不能被x变量引用”,如果可以那么就直接引用了),这里的所谓“强制类型转换”根本没有复制任何对象,你完全不用过分形而上学地去理解“转换”这个词。