所以基本上我有一个对象,它接受实例并将它们添加到列表中。每个实例都使用虚拟方法,我需要在创建实例后覆盖这些方法。我将如何覆盖实例的方法?
问问题
9778 次
3 回答
16
你不能。您只能在定义类时覆盖方法。
最好的选择是使用适当的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!"
于 2012-09-24T19:31:28.147 回答
0
一旦创建了对象,C# 就是静态的,您无法更改对象的行为。您可以使用继承对超类进行子类化,但这是在设计时完成的,而不是在运行时完成的。
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的概念——面向方面的编程。这是您可以开始在运行时注入行为的地方。我知道有两个框架可以做到这一点
- 城堡动态代理
- 春天网
于 2012-09-24T19:34:33.983 回答
0
这在运行时是不可能的。实例化后,您无法更改类的行为。但是,您可以考虑创建委托方法。
编辑,刚看到第一个答案,继续;)
于 2012-09-24T19:37:17.970 回答