C# 替换没有继承的类方法

C# 替换没有继承的类方法,c#,polymorphism,shadow,C#,Polymorphism,Shadow,我想完全替换一个我没有编写的类的方法。我很难找到这个问题的答案,因为我不确定它叫什么,因为我不认为它在技术上被认为是压倒一切的 例如: 假设我有一些代码在很多位置广泛使用List对象。我经常对这些对象调用Sort方法,但现在我想更改Sort方法的实现,以执行一些额外的操作 我可以创建一个新类MyList,它继承自List并重写Sort方法,但这意味着我必须检查所有代码,并确保将所有List对象更改为MyList。这可能会产生一些问题,因为我到处都在使用列表,很容易遗漏一些对象 这不是字面上的情况

我想完全替换一个我没有编写的类的方法。我很难找到这个问题的答案,因为我不确定它叫什么,因为我不认为它在技术上被认为是压倒一切的

例如:

假设我有一些代码在很多位置广泛使用List对象。我经常对这些对象调用Sort方法,但现在我想更改Sort方法的实现,以执行一些额外的操作

我可以创建一个新类MyList,它继承自List并重写Sort方法,但这意味着我必须检查所有代码,并确保将所有List对象更改为MyList。这可能会产生一些问题,因为我到处都在使用列表,很容易遗漏一些对象


这不是字面上的情况,但希望这个例子有意义。我知道我试图做的可能被认为是糟糕的设计,但我仍然想知道这是否可行。

如果您想在不继承现有类的情况下向其添加功能,通常是最好的方法

然而,在这种特殊情况下,这是没有必要的。如果要更改
Sort
方法对列表排序的方式,最好的方法是创建一个或更简单的a,然后调用适当的重写

例如,假设您有一个
列表
,您希望对其进行排序,以便所有偶数都排在第一位。您可以这样做:

var list = new List<int> { 1, 2, 3, 4, 5 };
list.Sort((x, y) => (x % 2 == y % 2) ? x - y : x % 2 - y % 2);
// list = { 2, 4, 1, 3, 5 }
var list=新列表{1,2,3,4,5};
排序((x,y)=>(x%2==y%2)?x-y:x%2-y%2);
//列表={2,4,1,3,5}

这就是为什么要编码到接口而不是实现,并使用IoC/DI检索实现的原因

例如,如果您的代码最初是:

interface IFoo { void Go(); }
class Foo : IFoo { public void Go() { } }
class SomeOtherFoo : IFoo { public void Go() { } }

IFoo foo = MyIoCLibrary.Get<IFoo>(); // instead of new Foo()
foo.Go();

or

public class SomeClass : IWhatever {

    private IFoo _foo;

    // Your DI library will call this constructor automatically
    public SomeClass(IFoo foo) {
        _foo = foo;
    }
}
接口IFoo{void Go();}
类Foo:IFoo{public void Go(){}
类SomeOtherFoo:IFoo{public void Go(){}
IFoo foo=MyIoCLibrary.Get();//而不是新的Foo()
foo.Go();
或
公共类:我曾经{
私人伊福(IFoo),;
//您的DI库将自动调用此构造函数
公共类(IFoo-foo){
_foo=foo;
}
}
假设您的IoC库将
IFoo
指向
Foo
。在运行时,所有
IFoo
实例都将是
Foo
,因此它们将执行
Foo
所做的任何操作。在路上的某个地方,你想改用
SomeOtherFoo
——你只需将配置更改为指向
IFoo
SomeOtherFoo
,而不必再接触另一行代码

但是,如果您已经到处都有实现,您将无法使用此技术-您首先必须用
IFoo
替换所有
Foo
变量,并用适用的IoC/DI方法替换实例化。

我想您需要

我经常这样做,当我想要一个对象拥有的所有东西,但无法访问它的内部,或者添加一些额外的功能时。因此,您将包装所需对象中的每个方法,然后在特定方法中实现您自己的功能

这里有一个很好的例子。

它被称为shadow方法,但我敢肯定它在这里对您没有帮助:您可以创建一个扩展方法,但不能覆盖现有方法,因此您仍然需要在使用它的任何地方更改调用。您可以改为在列表中的对象内实现排序吗?并让它们帮助您获得正确的排序顺序,而无需替换
列表
?在这种情况下,您可能会发现以下内容非常有用:无需子类化,您可以编写一个扩展方法来有效地将
排序和
方法添加到
列表
类中。但是一个叫做
Sort
的方法应该排序而不做其他事情。如果他真的对排序感兴趣,那么这是一个很好的解决方案。但他似乎只是举了一个例子???如果你使用这种方法,就可以很容易地使用Decorator模式来扩充你的对象,而不会弄乱它的源代码。