2012-10-23 34 views
1

有以下繼承:我如何正確地繼承和隱藏基方法

class A 
{ 
    void Configure(object param1) {...}; 
} 

class B : A 
{ 
    void Configure(object param1) {...}; // The method is not defined in B, it is available from the base class. This is just the desired interface of class B 
} 

class C : A 
{ 
    void Configure(object param1, object param2) {...}; 
} 

我不想C類有一個配置參數1與可見的在這種情況下,它會留下對象不完整的。

我試過重寫,但重寫不能改變可見性。

我發現被調用類的方法protected void ConfigureBase(object param1) {...};,使B級呼叫ConfigureBase的方法配置的唯一方法。

。我不完全滿意這個設計,因爲它讓我重新定義每個類的配置是有處理這一個標準呢?

+1

這看起來像一個[XY解決的問題很多(http://meta.stackexchange.com/questions/66377/what-is-the- XY-問題)。您遇到的問題與您沒有告訴我們的問題有關。每個基礎和派生類型的目標是什麼? –

+0

感謝您的想法,但我認爲下面的答案足以瞭解我需要什麼。再次感謝。 –

回答

5

這是不可能的。你可能會讓這個方法拋出一個異常,所以它不能被使用,但是在編程中繼承的一個基本原則是,一個孩子總是可以被看作是它的父類型。應該怎樣做如下:

A obj = new C(); 

obj.Configure(new object());//should this work, or not? 

在設計上,有沒有辦法來限制孩子不能夠做一些它的父能做。如果C確實無法訪問Configure(object obj)方法,則需要從根本上重新設計程序。這可能可能意味着C真的不應該延長A(這可能使兩個AC感,實現共同的接口),或者只是Configure真的不應該是那種類型的公共方法。不知道更多,很難提出替代方案。

+0

那麼,類A有很多代碼實現B和C的共同行爲,只是C有一個參數比B多,所以我真的認爲C是A的超類。你的例子不起作用,因爲類A是一個抽象的保護類,它包含B和C共有的東西。 –

+2

@SoMoS我的觀點是,它是一個多態的基本概念,你可以把對象看作它的一個基類,所以我發佈的代碼*必須*能夠工作;你想做什麼會違反這一點。如果'A'是一個抽象基類,那麼也許它不應該有一個'Configure'方法。這聽起來像是'B'和'C'應該有,並有適當的過載。 – Servy

2

有沒有處理這個標準呢?

是:做初始化的配置過程的一部分。

而不是暴露Configure,在構造函數中執行所有初始化。這將讓你的類只露出有意義的選擇:

class A { 
    public A(object param1) {...}; 
} 

class B : A { 
    public B(object param1) : base(param1) {...}; // This re-exposes A's constructor 
} 

class C : A { 
    // Note that A(param1) constructor is not available, even though C inherits A 
    public C(object param1, object param2) : base(param1) {...}; 
} 
+0

我不能主要是因爲MVVM和IoC。我喜歡過去的時間,你可以把所有需要的東西放在構造函數中。 –

+1

@SoMoS那麼,你所描述的「保護和發佈」方法是最好的方法:它可以讓你保持控制暴露具有正確簽名的'Configure'而只需很少的工作。 – dasblinkenlight