2013-02-01 144 views
0

給出下面的例子,是否有可能用ClassyFoo擴展Foo類,並且由ClassyFoo繼承的Bar實例繼承自ClassyFoo,同時保持由Foo創建的Bar實例仍然繼承Foo?從派生類或基類版本的類繼承C#類

例如:

class Foo 
    { 
     protected Foo() 
     { 
      Console.WriteLine("Setting up Foo"); 
     } 

     public static void Show() 
     { 
      Console.WriteLine("Showing Foo"); 
      var bar = new Bar(); 
     } 
    } 

    class ClassyFoo : Foo 
    { 
     public ClassyFoo() : base() 
     { 
      Console.WriteLine("Setting up Classy Foo"); 
     } 

     public new static void Show() 
     { 
      Console.WriteLine("Showing Classy Foo"); 
      var bar = new Bar(); 
     } 
    } 

    class Bar: Foo 
    { 
     public Bar() : base() 
     { 
      Console.WriteLine("Setting up Bar"); 
     } 
    } 

ClassyFoo.Show的期望的輸出()是:

顯示優等的Foo
設置的Foo
設置優等的Foo
設置酒吧

而Foo.Show的輸出()是:

顯示美孚
設立富
設置酒吧

的情況Bar類增加了一些配置/專業化美孚,但優雅的Foo也是如此。但Bar和ClassyFoo的專業化可以存在於同一個對象上。

我試圖避免從ClassyFoo繼承重複酒吧。實際上有多個酒吧,但只有一個ClassyFoo,所以這將是很多重複。

+0

實例不會從類繼承,實例是從其他類繼承的類的實例。你有'Bar:Foo',所有'Bar'實例都是如此。聽起來像你可能需要另一個子類,'ClassyBar'。 – Blorgbeard

+0

也許看一看在C#創建一個混合的這種方法:http://www.zorched.net/2008/01/03/implementing-mixins-with-c-extension-methods/ – gideon

回答

1

我想說這是不可能的。一個類只有一個基類。

您可能能夠實現ClassyFoo和/或Bar作爲接口,並讓實際的類從一個或另一個或兩個繼承。

根據實際的陳述和代碼重用我會想辦法讓這兩個接口(類似處理)或一個抽象類(你可以的東西在裏面一堆代碼)

0

爲C#不支持你的多重繼承必須使用界面,而不使用界面,你不能這樣做。

1

不知道你想什麼來實現,但你打電話Foo.Show()是闖民宅酒吧的實例有無關ClassyFoo SI在沒有辦法,你可以期待有什麼。