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

时间:2011-08-17 17:08:45

标签: c# oop

我正在使用C#,但我认为这是一个非常通用的OO问题。假设我有一个名为Animal的类,它具有LegCount,EyeCount,HasFur,EatsMeat等属性。

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

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

我想用简单的英语做的是:

创建Dog的新实例d,其中包含a的所有起始值。关键是“全部”,而不是单独指定每个属性。

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

4 个答案:

答案 0 :(得分:20)

您想要的功能称为“原型继承”或“prototype-oriented programming”。 C#不支持此功能,所以你在那里运气不好。

如果您的架构从根本上需要此功能,您可以考虑使用支持原型继承的语言。 JavaScript是最常用的原型继承语言。

如果你不小心,原型继承可能非常棘手。如果您对此主题感兴趣,请参阅我的文章,了解JScript中可能遇到的一些奇怪的情况:

http://blogs.msdn.com/b/ericlippert/archive/2003/11/06/53352.aspx

答案 1 :(得分:5)

您无法使用某些C#语言构造执行您所要求的操作,您必须手动编写映射或委派代码。或者,请查看AutoMapper

答案 2 :(得分:1)

你可以尝试使用装饰模式的不同方法吗?子类化的替代方法,用于扩展功能。然后保留Animal类实例中的所有值

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

答案 3 :(得分:1)

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成为一个抽象类。因为你认为什么是动物类的实例..