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 派生出一个你想要确保的界面来装饰它。或者做一个抽象方法声明。
这样的事情可能吗?
假设我有字符串 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 派生出一个你想要确保的界面来装饰它。或者做一个抽象方法声明。