请问各位:
现有类Employee,属性有Id和Name。
Ceo类继承自Employee类,同时加入自己的属性。
Cto类也派生自Employee类,同时也加入自己的属性。
下面这个方法:DeleteEmployeeById(Employee emp);
可以对今后拓展自Employee的类使用。
那么假如有一些方法内使用到了Ceo或Cto中自己的属性,也就是说,需要使用非继承来的属性。
那么是否这个方法就只能对Ceo或者Cto以及继承他们的类拓展了呢?
若Ceo和Cto不可被继承,那么这些方法就不存在兼容性了吗?
需要怎么设计才合理呢?
说白了,就是一个抽象工厂的设计模式。
其实我想知道,对一族类型的最子级的函数,就是那些使用派生类属性的函数,是不是就不存在复用的可能了呢。
就好比OralceDataAccess和SqlDataAccess的自身的特性,无法在DbDataAccess中使用一样。没有好的解决办法。
@DeadGardens: 特定的函数用于特定的对象,如果你非要这么做,用泛型吧,泛型可以逆变。
@DeadGardens: 不是继承来的就是应该不能复用!你要先判断功能是共性还是个性,面向对象设计有自己的原则,例如狗有的哺乳动物的基本特征这是继承,猫和狗都会叫但叫得不一样这是多态,你非让狗长个犄角,这是乱搞。写代码不是复用的越多越好,不要为了复用而复用,你写一个超级万能的大方法可能是你业务逻辑的瓶颈,很多不必要的逻辑耦合在一起,改动一点却发现牵一发而动全身。
@上帝之城: 我试试,主要是现在有一族对象,但是很多函数都是基于派生类的。
比如AddXXX(XXX),AddYYY(YYY),AddZZZ(ZZZ),XXX和YYY还有ZZZ都继承AAA,给我感觉这里使用继承的更大作用是代码复用,而不是为了今后拓展,很纠结。
@C#开发人员: 你说的很对,我有些了解了。
可以使用多态来解决这个问题,然后在使用一个工厂类去创建。
我的初衷只是想把代码写的能向后拓展。谢谢你了。
关于API设计,一般若类之间不存在继承关系,但接口功能相似,泛型接口是个比较理想的选择。
API设计的常见规范是,输入参数越抽象越好,返回的东西越具体越好。关于输入参数(父类)和返回参数(子类),可以参考协变和逆变。
我感觉你是想用泛型接口,你去查查看
下面这个方法:DeleteEmployeeById(Employee emp);
可以对今后拓展自Employee的类使用。【拓展是什么意思?继承吗?】
那么假如有一些方法内使用到了Ceo或Cto中自己的属性,也就是说,需要使用非继承来的属性。
那么是否这个方法就只能对Ceo或者Cto以及继承他们的类拓展了呢?【拓展指什么?】
若Ceo和Cto不可被继承,那么这些方法就不存在兼容性了吗?
你能把你想要的东西表达清楚吗?
继承的大忌就是,不要以为代码看上去很多地方都差不多就是来个继承,搞都后面越来越多个性化的时候,基类堆满了逻辑代码;而是要看对象的性质,看看在某种环境下是不是属于同类别的,是就可以继承,