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