C#覆盖实例方法

时间:2012-09-24 19:29:43

标签: c# .net

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

3 个答案:

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

  1. Castle Dynamic Proxy
  2. Spring.Net

答案 2 :(得分:0)

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

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