【问题标题】:Assign base object of child object分配子对象的基础对象
【发布时间】:2013-06-20 07:51:22
【问题描述】:

我有一个基类和一个子类。基类包含一些变量,子类包含一些变量。

我需要做的是,当我创建子类的对象时,我在其构造函数中传递基类对象,它将设置子对象的基类变量。

代码:

public class BaseClass
{
    public int BaseInteger;
    public double BaseDouble;
    public bool BaseBool;
}

public class ChildClass : BaseClass
{
    public ChildClass(BaseClass baseClass)
    {
        this.base = baseClass;     // I am trying to do this.
    }

    public int ChildInteger;
    public string ChildString;
}

那么我在这里尝试做的事情是否可能。如何?当我尝试这段代码时,我得到了这个错误。

Use of keyword 'base' is not valid in this context

【问题讨论】:

    标签: c# inheritance


    【解决方案1】:

    您必须意识到ChildClass包含 BaseClass,而是继承它。

    这就是为什么您可以使用this 关键字(例如this.BaseInteger)访问在基类中定义的数据和方法。

    这也是为什么你不能“设置”BaseClassChildClass,它不包含一个。

    尽管如此,有一些有用的模式可以实现您想要做的事情,例如:

    public class BaseClass
    {
        protected BaseClass() {}
    
        protected BaseClass(BaseClass initData)
        {
            this.BaseInteger = initData.BaseInteger;
            this.BaseDouble = initData.BaseDouble;
            this.BaseBool = initData.BaseBool;
        }
    
        public int BaseInteger;
        public double BaseDouble;
        public bool BaseBool;
    }
    
    public class ChildClass : BaseClass
    {
        public ChildClass() {}
    
        public ChildClass(BaseClass baseClass) : base(baseClass)
        {
        }
    
        public int ChildInteger;
        public string ChildString;
    }
    

    感谢@svick 的建议。

    【讨论】:

    • 你错误地将class关键字与基类构造函数一起使用
    • 我会考虑制作BaseClass 构造函数protected,如果它应该只用于子类。此外,BaseClass 需要另一个构造函数,这样您就可以创建一个实例而无需从另一个实例中复制它。
    • @svick,真的。我只是懒得添加它。修订。
    • 我看到的问题是如果基类中有太多变量怎么办,如果基类派生自另一个类并包含一些复杂的类对象怎么办。那么受保护的构造函数就足够大了。
    • 我的意思是 BaseClass 需要另一个构造函数,而不是 ChildClass。您当前的代码甚至无法编译。
    【解决方案2】:
    public class BaseClass
    {
        public int BaseInteger;
        public double BaseDouble;
        public bool BaseBool;
    }
    
    public class ChildClass : BaseClass
    {
        public ChildClass(BaseClass baseClass)
        {
            this.BaseInteger = baseClass.BaseInteger;
            this.BaseDouble = baseClass.BaseDouble;
            this.BaseBool = baseClass.BaseBool;
        }
    
        public int ChildInteger;
        public string ChildString;
    }
    

    【讨论】:

    • 您也可以将该构造函数放入BaseClass 本身,然后向上传递引用
    【解决方案3】:

    我认为最优雅的方法是在 BaseClass 类中创建第二个构造函数,该构造函数接受一个应该初始化其字段的 BaseClass 实例。然后你可以简单地在你的 ChildClass 类中调用这个基础构造函数:

    public class BaseClass
    {
        public int BaseInteger;
        public double BaseDouble;
        public bool BaseBool;
    
        public BaseClass()
        {
        }
    
        public BaseClass(BaseClass baseClass)
        {
            this.BaseInteger = baseClass.BaseInteger;
            this.BaseDouble = baseClass.BaseDouble;
            this.BaseBool = baseClass.BaseBool;
        }
    }
    
    public class ChildClass : BaseClass
    {
        public int ChildInteger;
        public string ChildString;
    
        public ChildClass(BaseClass baseClass) : base(baseClass)
        {
        }
    

    }

    【讨论】:

    • 我看到的问题是如果基类中有太多变量怎么办,如果基类派生自另一个类并包含一些复杂的类对象怎么办。那么受保护的构造函数就足够大了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多