6

所以基本上我有一个对象,它接受实例并将它们添加到列表中。每个实例都使用虚拟方法,我需要在创建实例后覆盖这些方法。我将如何覆盖实例的方法?

4

3 回答 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的概念——面向方面的编程。这是您可以开始在运行时注入行为的地方。我知道有两个框架可以做到这一点

  1. 城堡动态代理
  2. 春天网
于 2012-09-24T19:34:33.983 回答
0

这在运行时是不可能的。实例化后,您无法更改类的行为。但是,您可以考虑创建委托方法。

编辑,刚看到第一个答案,继续;)

于 2012-09-24T19:37:17.970 回答