0

我有一个已经变得太长的A类。所以我决定把它的一些功能移到 B 类。我让 B 从 A 继承。

现在A中有函数,需要B中的函数。我的问题是我应该在A类的哪里实例化B类。我不能在A类的构造函数中实例化,因为B类会调用基类来创建一个永无止境的循环。

我只希望类 B 被实例化一次,因为类 A 构造函数具有我只想初始化一次的对象。

我什至不确定我现在是否有意义。

4

5 回答 5

4

继承被严重过度使用。特别是在您的情况下,您希望组合而不是继承

于 2012-06-14T13:38:29.083 回答
3

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)。您可以将您的课程分成多个文件。显然你现在做的不是继承的意图和意义。

于 2012-06-14T13:39:56.550 回答
1

首先,当你的类变得太长时,定义一个新类并不是最佳实践。如果所有功能在逻辑上都与同一个对象相关,那么无论它有多长,您都可以将其保留在同一个类中。

如果您希望 B 仅被实例化一次,您应该将其设为静态类。您可以在此处找到有关静态类的更多信息:http: //msdn.microsoft.com/en-us/library/79b3xss3 (v=vs.80).aspx

于 2012-06-14T13:39:05.947 回答
1

如果您将函数抽象化A(这也必须A抽象化),那么只需A像往常一样从 的方法中调用这些方法。B然后用你想要的逻辑覆盖抽象函数。当用户实例化B类时,这些调用将转换为调用,B即使保存实例的变量的编译时类型是A.

于 2012-06-14T13:39:57.273 回答
1

如果存在真正的“is-a”关系,您应该只使用继承。对我来说,听起来您正在描述 B 类需要的功能。也许 B “有” A 所以你应该考虑组合而不是继承:

public class B
{
    private A a;

    public B(A a)
    {
       this.a = a;
    }

    public void UseAFunction()
    {
        a.MyFunction();
    }
}
于 2012-06-14T13:40:13.997 回答