我正在使用C#,但我认为这是一个非常通用的OO问题。假设我有一个名为Animal的类,它具有LegCount,EyeCount,HasFur,EatsMeat等属性。
假设我有一个动物实例a
。假设a
将LegCount设置为4,EyeCount设置为2。
现在,我想创建一个类型为Dog的实例d
,它继承自Animal。我想用d
的所有值初始化a
。我意识到我可以创建一个构造函数或其他一些方法来接受一个Animal并吐出一个新的Dog并复制所有值,但我希望有一些面向对象的原则/技巧让我受到了覆盖。
我想用简单的英语做的是:
创建Dog的新实例d
,其中包含a
的所有起始值。关键是“全部”,而不是单独指定每个属性。
当您设计一个继承自其他类的类时,您不需要列出它继承的所有成员。它只是继承了所有这些。所以我想知道我是否可以在实际实例上“继承值”。
答案 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类实例中的所有值
答案 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成为一个抽象类。因为你认为什么是动物类的实例..