2012-09-24 58 views
3

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

+3

不重写的_instance_的方法,你重写_class_的方法。如果您需要重写方法,请使用重写的方法定义子类并创建这些子类的实例。 –

+1

也许重写不是来自OP的单词的最佳选择,但他们想要做的是一个有效的想法,实质上他们希望能够在运行时改变功能,正如@JustinNiessner所说,可以很好地使用与会代表。 –

回答

14

你不行。定义类时只能覆盖方法。

最好的办法是转而使用适当的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!" 
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个框架,我意识到这样做

  1. 城堡动态代理
  2. Spring.Net
+0

我已经考虑过这个,但是我不知道将会定义多少个对象类型。 – tsturzl

0

这是不可能的运行。一旦它被实例化,你就不能改变一个类的行为。然而你可以看看创建一个委托方法。

编辑,刚才看到的第一个答案,去与;)