繁体   English   中英

C#继承从父类调用派生类函数

[英]C# inheritance calling derived class functions from parent class

我的A类课程太长了。 因此,我决定将其某些功能移至B类。我已使B从A继承。

现在A中有函数,B中需要函数。我的问题是我应该在哪里实例化类A中的类B。我不能在类A构造函数中实例化,因为类B将调用基类以创建永不结束的循环。

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

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

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

base关键字使您可以访问超类(基类): http : //msdn.microsoft.com/zh-cn/library/hfw7t1ce (v=vs.71) .aspx

但是:如果您只关心类的长度,则使用部分类可能是更好的解决方案( http://msdn.microsoft.com/zh-cn/library/wa80x488(v=vs.80).aspx )。 您可以将您的课程分为多个文件。 显然,您现在所做的不是继承的意图和意义。

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

如果只想实例化一次B,则应将其设为静态类。 您可以在这里找到有关静态类的更多信息: http : //msdn.microsoft.com/zh-cn/library/79b3xss3(v=vs.80).aspx

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

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

public class B
{
    private A a;

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

    public void UseAFunction()
    {
        a.MyFunction();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM