c# .net:使用初始化时应覆盖的方法扩展现有 class

c# .net: Extend existing class with method that should be overriden when initialized

这样的事情可能吗?

假设我有字符串 Class。我想添加一个方法 DoStringCalc()。现在我想要一个 Class 来保存所有这些特殊字符串并在所有字符串上调用 DoStringCalc()。但是每个 String 在 DoStringCalc() 中可以有不同的逻辑,并且可以有成千上万个。

对我来说最合乎逻辑的(来自 java)是在初始化新字符串时覆盖方法 DoStringCalc()。例如:

String hello = new String() {
    public override DoStringCalc() {
        //do something here
    }
}

这在 C# 中是如何解决的?

如果我没理解错的话interface就是你要找的。

创建一个需要方法的接口DoStringCalc()。然后让所有的字符串 类 继承接口并实现它们的 DoStringCalc() 方法。之后你可以,例如使用允许任何字符串实例 类 的强类型列表 List<IExampleInterface> 并从中调用它们各自的 DoStringCalc()

如果您有许多不同的计算逻辑,请考虑将转换函数传递给class。用 class 包装您将使用的值,并在相同的 class:

中存储适当的转换
public class Foo
{
    public string Value;
    private Func<string, string> doStringCalc;

    public Foo(string value, Func<string, string> doStringCalc)
    {
        this.Value = value;
        this.doStringCalc = doStringCalc;
    }

    public void ExecuteTransform()
    {
        this.Value = this.doStringCalc(this.Value);
    }
}

然后添加不同的变换如下:

var foo1 = new Foo("A", (initialValue) => initialValue + initialValue);
var foo2 = new Foo("B", (initialValue) => initialValue + "bar");
var foo3 = new Foo("C", (initialValue) => " ");

foo1.ExecuteTransform();
foo2.ExecuteTransform();
foo3.ExecuteTransform();

Debug.WriteLine(foo1.Value); // prints "AA"
Debug.WriteLine(foo2.Value); // prints "Bbar"
Debug.WriteLine(foo3.Value); // prints " "

一个选项是传入 Action 作为 class 构造函数的一部分(或者 Func 如果你想 return 一个值)。例如:

public class MyThing
{
    private Action<MyThing> _doCalc { get; set; }

    public MyThing(Action<MyThing> doCalc)
    {
        _doCalc = doCalc;

    }

    public void DoCalc()
    {
        _doCalc(this);
    }

    public string SomeString { get; set; }
}

并这样称呼它:

var thing = new MyThing(t => Console.WriteLine(t.SomeString));
thing.SomeString = "Hello world";
thing.DoCalc();

另一种变体是创建通用包装器 class,例如:

public class Wrapper<T>
{
    private Action<T> _doCalc { get; set; }

    public Wrapper(Action<T> doCalc)
    {
        _doCalc = doCalc;
    }

    public T Value { get; set; }

    public void DoCalc()
    {
        _doCalc(this.Value);
    }
}

现在您可以这样做了:

var stringWrapper = new Wrapper<string>(t => Console.WriteLine("string wrapper"));
var intWrapper = new Wrapper<int>(t => Console.WriteLine("int wrapper"));

stringWrapper.DoCalc();
intWrapper.DoCalc();

据我所知,无法更改 class因为您不拥有源代码。例如。 .Net 类.

您可以使用扩展方法扩展现有 class:

public static classe StringExtension
{
    public static void DoStingCalc(this string str)
    {
         //Do your Stuff here
    }
}

如果你想强制一个特定的方法。你必须从你的 class 派生出一个你想要确保的界面来装饰它。或者做一个抽象方法声明。