2011-06-28 41 views
1

假設我需要inherit from two classes in C#。這是不允許的,所以我可以做到以下幾點:從類繼承,幷包括其他類的成員變量,從接口繼承和通過將其重定向到該成員變量重新實現這些接口的所有方法:有沒有一種方便的方法將所有接口方法映射到子對象上?

interface SecondBaseInterface { 
    void FirstMethod(); 
    void SecondMethod(); 
}; 

class MyClass : FirstBaseClass, SecondBaseInterface { 

    public void FirstMethod() 
    { 
     secondBase.FirstMethod(); 
    } 

    public void SecondMethod() 
    { 
     secondBase.SecondMethod(); 
    } 

    SecondBaseClass secondBase = new SecondBaseClass(); 
}; 

現在這個工作,但如果在有很多方法,它將需要大量的代碼輸入,實際上沒有什麼用處,我將不得不保持該代碼以防更改。

是否有一些C#功能會告訴編譯器「對於所有方法的請調用此成員變量的相應方法」或其他方便的方法來做這種大規模的重定向?

+0

作爲一個側面說明,Resharper具有生成此類方法的功能。可以節省你輸入很多,但不會從雜亂的代碼保存。 **生成 - >委派成員** – Snowbear

+0

正則表達式,控制檯,複製,粘貼?哦,等你想要方便:) – FlyingStreudel

回答

1

有沒有簡單的語言功能,彈簧想到,這裏有一些想法:

  1. 使用.NET4.0 DynamicObject,在那裏你可以在飛行中添加屬性/成員。
  2. 使用Aspect Oriented Priogramming或IL Weaving來添加混合。例如,請參見PostSharp
  3. 使用某種形式的代碼生成,例如ReSharper
1

我想有這樣的機會太多,但我不認爲它的存在。不過,如果你真的需要一個可以作爲它的超類的類,那麼不要害怕這樣做:這就是衆所周知的delegation pattern(正如你可能知道的那樣)。

1

我認爲幾乎每個經驗豐富的C#開發人員都希望在某個階段 - 特別是那些以前的Delphi開發人員。它被稱爲「由代表團實施」,並在Delphi中提供。

其實負責人特爾斐功能,史蒂夫·特謝拉,現就職於MSFT。 Here's a blog entry他在那裏談論它。

不幸的是C#不能做到這一點的CLI中不支持代表團的實現。

+0

你可以在[Oxygene](http://prismwiki.codegear.com/en/Implements_(keyword))和[Nemerle](http://nemerle.org/Design_patterns# Proxy_design_pattern)。雖然,我認爲它有一些[限制](http://codecrafter.blogspot.com/2010/11/interface-implementation-through_09.html)。 –

1

我知道痛苦。

這麼多,我已經開始了我自己的項目來解決這個問題:NRoles

這帶來的trait (pdf)到C#的形式。

您的代碼應該是這樣的:

class FirstRole : Role { 
    public void FirstMethod() { ... } 
    public void SecondMethod() { ... } 
} 

class SecondRole : Role { 
    ... 
} 

class MyClass : Does<FirstRole>, Does<SecondRole> { 

} 

您也可以通過角色實現接口,並且他們將結轉到作曲類。

相關問題