2010-11-04 189 views
0

我想覆蓋自定義dll中ClassA的打印方法。「在運行時覆蓋方法」C#

public ClassA 
{ 
    public void Print(string arg1, string arg2, string arg3, string arg4) 
    { 
    } 
} 

這是可能的C#?

+1

請澄清:你想重寫/陰影/隱藏外國類的方法?你*真的*想在運行時做這個*而不是*設計時* *? – Bobby 2010-11-04 10:51:42

+0

@Bobby:Shadowing在運行時不會幫助一點。它在編譯時解決。 – leppie 2010-11-04 10:53:53

+0

@leppie:這就是爲什麼我問他*真的想做什麼。 – Bobby 2010-11-04 11:02:11

回答

0

你的第一個問題:該方法不標明virtual。你不能override一個非虛擬的方法。

至於這個問題,這一切都取決於如何ClassA被實例化和使用。例如,你可以在運行時創建一個派生類型,如果你可以控制它的實例化和使用。

1

我相信痣微軟研究院做類似的事情。他們有一個系統,可以讓你覆蓋例如DateTime.Now,迫使它返回一個特定的日期/時間。

看一看http://research.microsoft.com/en-us/projects/pex/default.aspx以獲取更多信息。

+0

痣這樣做,不Pex的 – Kikaimaru 2010-11-04 11:02:05

+0

謝謝,更新的答案。 – 2010-11-04 11:03:57

1

這是不太一樣的東西,你都在問,但它實現了類似的效果...

爲什麼不定義一個接口爲您的操作。 ClassA實現接口。您的自定義策略也實現了界面。 ClassA在啓動時(在ClassA實例化時)在內部創建接口的「默認」實現,但也有一個允許設置接口的屬性。接口甚至可以允許用戶定製的策略來指定,它實際上實現了接口的成員:

interface IStrategy 
{ 
    void Operation1(int x, int y); 
    void Operation2(string a, string b); 
} 

class ClassA : IStrategy 
{ 
    private IStrategy builtInStrategy = new BuiltInStrategy(); 

    public IStrategy CustomStrategy { get; set; } 

    void Operation1(int x, int y); 
    { 
    if (CustomStrategy != null) 
    { 
     CustomStrategy.Operation1(x, y); 
    } 
    else 
    { 
     builtInStrategy.Operation1(x, y); 
    } 
    } 

    void Operation2(string a, string b) 
    { 
    if (CustomStrategy != null) 
    { 
     CustomStrategy.Operation2(a, b); 
    } 
    else 
    { 
     builtInStrategy.Operation2(a, b); 
    } 
    } 
} 

你可以指定爲IStrategy的一部分對接的方式爲用戶定製的策略,以表明它是不是「壓倒一切「一個特定的操作。也許它可能會返回bool而不是空白,或者如果自定義策略未覆蓋某個操作,則每個操作都可能有一個out bool參數設置爲false。

根據有多少操作可以被覆蓋,你甚至可以考慮將每個操作自己的接口。如果不實施一項操作而不實施一些其他操作是不合理的,則操作可以被分組在接口中。

interface IOperation1 
{ 
    void Operation1(int x, int y); 
} 

interface IOperation2 
{ 
    void Operation2(string a, string b); 
} 

interface IMath 
{ 
    int Add(int i, int j); 
    int Subtract(int i, int j); 
    int Multiply(int i, int j); 
    int Divide(int i, int j); 
} 

interface IStrategy 
{ 
    //What operations should the Strategy have? 
} 

class ClassA : IOperation1, IOperation2, IMath 
{ 
    public IStrategy CustomStrategy { get; set; } 

    public void Operation1(int x, int y) 
    { 
    IOperation1 op1 = CustomStrategy as IOperation1; 
    if (op1 != null) 
    { 
     op1.Operation1(x, y); 
    } 
    else 
    { 
     //Do ClassA's Operation1 logic here 
    } 
    } 

    public void Operation2(string a, string b) 
    { 
    IOperation2 op2 = CustomStrategy as IOperation2; 
    if (op2 != null) 
    { 
     op2.Operation2(a, b); 
    } 
    else 
    { 
     //Do ClassA's Operation2 logic here 
    } 
    } 

    // 
    // And so on ... 
    // 
} 
0

這是不可能的,因爲我不能延長ClassA的,因爲它是與應用交付的核心DLL