我可以实例化一个继承父类实例值的类吗?

本文关键字:实例 父类 继承 实例化 一个 我可以 | 更新日期: 2023-09-27 18:06:07

我正在使用c#,但我认为这是一个相当通用的面向对象问题。假设我有一个叫做Animal的类,它有LegCount, EyeCount, HasFur, EatsMeat等属性。

假设我有一个动物的实例a。假设a的LegCount设置为4,EyeCount设置为2。

现在,我想创建一个类型为Dog的实例d,它继承自Animal。我想用a的所有值初始化d。我意识到我可以创建一个构造函数或其他一些方法来获取一个Animal,然后生成一个带有所有复制值的新Dog,但我希望有一些面向对象的原则/技巧可以覆盖我。

我想做的,用简单的英语来说,是:

创建Dog的新实例d,所有的初始值都来自a。关键字是"all",而不是单独指定每个属性。

当你设计一个从其他类继承的类时,你不需要列出它继承的所有成员。它只是继承了所有这些。所以我想知道我是否可以在实际实例上"继承值"。

我可以实例化一个继承父类实例值的类吗?

您想要的特性称为"原型继承"或"面向原型的编程"。c#不支持这个特性,所以你就没那么幸运了。

如果你的架构从根本上需要这个特性,你可以考虑使用一种支持原型继承的语言。JavaScript是最常用的原型继承语言。

如果不小心的话,原型继承可能很难得到正确的处理。如果您对这个主题感兴趣,请参阅我关于在JScript中使用原型继承可能遇到的一些奇怪情况的文章: http://blogs.msdn.com/b/ericlippert/archive/2003/11/06/53352.aspx

你不能用一些c#语言结构做你所要求的,你必须手动编写映射或委托代码。或者,看看AutoMapper

您可以尝试使用装饰器模式的不同方法?用于扩展功能的子类的替代方法。那么Animal类实例中的所有值都会被保留

http://www.dofactory.com/Patterns/PatternDecorator.aspx

public class Animal
{
    public Animal(Animal otherAnimal)
    {
        if (otherAnimal == null)
            throw new ArgumentNullException("otherAnimal");
        foreach (System.Reflection.PropertyInfo property 
            in typeof(Animal).GetProperties())
        {
            property.SetValue(this, property.GetValue(otherAnimal, null), null);
        }
    }
}

然后从你的Dog(Animal otherAnimal)构造函数

中调用这个Animal构造函数

但是你仍然应该再考虑一下你的类的设计,让Animal成为一个抽象类。