所以基本上我有一个对象,它接受实例并将它们添加到列表中。每个实例都使用虚拟方法,创建实例后我需要覆盖这些方法。我将如何重写实例的方法?
答案 0 :(得分:15)
你做不到。您只能在定义类时覆盖方法。
最好的选择是使用适当的Func
委托作为占位符,并允许调用者以这种方式提供实现:
public class SomeClass
{
public Func<string> Method { get; set; }
public void PrintSomething()
{
if(Method != null) Console.WriteLine(Method());
}
}
// Elsewhere in your application
var instance = new SomeClass();
instance.Method = () => "Hello World!";
instance.PrintSomething(); // Prints "Hello World!"
答案 1 :(得分:0)
一旦创建了对象,C#就是静态的,你不能改变对象的行为。您可以使用inhertance子类化超类,但这是在设计时完成的,而不是运行时。
class foo
{
public virtual void dosomething()
{
console.writeline("this is foo");
}
}
class bar : foo
{
public override void dosomething()
{
console.writeline("this is bar");
}
}
var list = new Foo[]{new foo(), new bar()};
还有AOP的概念 - 面向方面的编程。这是您可以在运行时开始注入行为的地方。有两个框架,我知道这样做
答案 2 :(得分:0)
这在运行时是不可能的。一旦实例化后,您就无法更改类的行为。但是,您可以考虑创建一个委托方法。
编辑,刚看到第一个答案,继续说;)