2013-03-19 90 views
1

我有一個名爲SimObject的定稿類。在這門課上,有一個名爲Draw()的公共職能。從另一個類分配實例的方法?

而不是在另一個新類中擴展和覆蓋從SimObject,我想分配一個方法來代替我的Main類中的Draw()。 Main類創建SimObject並保存它的一個實例。所以我該怎麼做這樣的事情:

public class Main { 
   public static void Main() { 
      //constructor  
      var obj = new SimObject(); 
      obj.Draw = MyNewDrawMethod; 
   } 

   public void MyNewDrawMethod() { 
      //some code 
   } 
} 

這是可能的C#?

+0

的一個實例的方法是通過它您密封或者是從你不能改變一個組件? – BenCr 2013-03-19 11:43:28

+0

你已經在你的問題中將'sealed'改爲'finalized'。你究竟是什麼意思?它是「密封」嗎?它可以繼承嗎?如果它不是'密封的',那麼你可以簡單地覆蓋派生類中的'Draw'方法。 – 2013-03-19 11:45:13

+0

它來自程序集。我無法訪問代碼。它被密封並最終確定。所以我無法真正擴展它。 – Carven 2013-03-19 11:45:24

回答

2

如果您不想繼承它,但想要擴展它,則可以使用Extension Method

public class MyList{ 


} 

public static class MyZListExtesion 
{ 
    public static void DrawSomethingElse(this MyList obj) 
    { 
     // override Draw from here 
    } 
} 

和使用

新MYLIST()DrawSomethingElse();

0

它不允許您分配方法,但可以使用擴展方法添加功能。

public static class SimObjectExtensions 
{ 
    public static void Draw(this SimObject obj) 
    { 
     // some code 
    } 
} 

這將允許你使用Draw方法,好像它是SimObject

SimObject o = new SimObject(); 
o.Draw(); 
+0

如果擴展方法與現有方法具有相同的名稱和參數,則將調用現有的方法 - 因此這將無濟於事。 – 2013-03-19 11:55:12

+0

啊,我沒有注意到對象已經有了一個'Draw'方法。如果他實際上需要「覆蓋」,因爲Draw是一些模板方法的一部分,或者聽起來像是塞滿了東西。有可能用反射做一些時髦的事情嗎? – BenCr 2013-03-19 11:58:14

+0

我認爲你是對的 - 他塞滿了。 – 2013-03-19 11:59:57

相關問題