Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中,如何向已构造的类添加功能?_C# - Fatal编程技术网

在C#中,如何向已构造的类添加功能?

在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

假设我已经有一只鸭子了。考虑到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.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) { ... }
}