我有一个A级已经太长了。所以我决定将它的一些功能移到B类。我已经从B继承了B.
现在A中有函数,需要B中的函数。我的问题是我应该在A类中实例化B类。我不能在类A构造函数中实例化,因为B类将调用基类来创建一个从不结束循环。
我只想要将类B实例化一次,因为类A构造函数具有我只想初始化一次的对象。
我现在甚至不确定我是否有任何意义。
答案 0 :(得分:4)
继承严重过度使用。特别是在您的情况下,您希望更喜欢composition over inheritance。
答案 1 :(得分:3)
base关键字允许您访问超类(基类):http://msdn.microsoft.com/en-us/library/hfw7t1ce(v=vs.71).aspx
BUT: 如果您唯一关心的是类的长度,那么使用部分类(http://msdn.microsoft.com/en-us/library/wa80x488(v=vs.80).aspx)可能是更好的解决方案。您可以将班级拆分为多个文件。显然你现在正在做的不是继承的意图和意义。
答案 2 :(得分:1)
首先,当你的课程太长时,定义一个新课程并不是最好的做法。如果所有功能在逻辑上与同一个对象相关,则无论多长时间,都可以将它保存在同一个类中。
如果您希望B只实例化一次,则应将其设为静态类。您可以在此处找到有关静态类的更多信息: http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.80).aspx
答案 3 :(得分:1)
如果你在A
中使函数变得抽象(这也必须使A
抽象),那么就像通常那样从A
的方法中调用这些方法。然后使用您想要的逻辑覆盖B
中的抽象函数。当用户实例化B
类时,即使包含该实例的变量的编译时类型为B
,这些调用也会转换为A
中的调用。
答案 4 :(得分:1)
如果存在真正的“is-a”关系,则应该只使用继承。对我来说,这听起来像是在描述B类所需的功能。也许B“有一个A”所以你应该考虑构成而不是继承:
public class B
{
private A a;
public B(A a)
{
this.a = a;
}
public void UseAFunction()
{
a.MyFunction();
}
}