2012-09-24 83 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

這是不可能的運行。一旦它被實例化,你就不能改變一個類的行爲。然而你可以看看創建一個委託方法。

編輯,剛纔看到的第一個答案,去與;)