在C#中,如何向已构造的类添加功能?
假设我已经有一只鸭子了。考虑到Duck是只读的,而C#是GC'd,有没有办法在不命中复制构造函数的情况下将Duck放入具有继承性的mallard中在C#中,如何向已构造的类添加功能?,c#,C#,假设我已经有一只鸭子了。考虑到Duck是只读的,而C#是GC'd,有没有办法在不命中复制构造函数的情况下将Duck放入具有继承性的mallard中 public class Duck { public readonly int wings; public Duck(int w) { wings = w; } } public class Mallard : Duck { public Mallard(Duck a) : base(a.wi
public class Duck
{
public readonly int wings;
public Duck(int w)
{
wings = w;
}
}
public class Mallard : Duck
{
public Mallard(Duck a) : base(a.wings)
{
}
}
鸭子不是绿头鸭,在C#中,没有办法使它成为绿头鸭。您必须以某种方式构造一个新的
Mallard
,无论是通过复制构造函数还是其他方法
在某些情况下,您可以使用组合而不是继承(尽管我认为在本例中它不会对您的域建模)
如果您只是想向Duck添加新功能,但无法更改,那么可以使用扩展方法
public static class DuckExtensions
{
public IEnumerable<Wing> CookWings(this Duck duck) { ... }
}
公共静态类扩展
{
公共IEnumerable Cookbings(这只鸭子){…}
}
不能将一种类型的实例“升级”为派生类型的实例<代码>鸭子无论如何可能应该是抽象的。var Duck=newduck(3);鸭子=新野鸭(鸭子)但是,你确实应该指定额外的机翼在哪一侧。那会影响导航。还有一个鸡/蛋的问题。“父母数据”表明了成分。现在你说的是装饰图案。但是你不能避免创建一个新的实例,这可能有助于理解为什么你需要这样一个静态的类型转换,因为它似乎没有完成多少工作。如果您需要在鸭子
上使用类型为绿头鸭
的方法进行操作,类似的操作可能会起作用:。更重要的是,您的设计是否也需要将河流转换为威士忌?
public static class DuckExtensions
{
public IEnumerable<Wing> CookWings(this Duck duck) { ... }
}