2015-06-23 53 views
0

爲了改進進一步的實現並提供一些指導方針並儘量保持項目內的通用性,我創建了一個接口,其中應包含一些方法用過的。然而,只有這個類的一個方法應該對調用該類的用戶可見,所以我希望它們是受保護的類。例如從類和接口或抽象類繼承其他類時隱藏方法

public class ClassThree 
{ 
    public ClassThree() 
    { 
     var classOne = new ClassOne(); 
     class1.MethodOne(); 
    } 
} 

儘管ClassOne有4個方法,但3種方法只用於一個公共類,因此是私有的或受保護的。這三種方法都需要使第四種方法起作用(在理想的情況下,其他開發人員將遵循相同的原則)。所以,我不希望看到以下彈出的智能感知:

class1.MethodTwo(); 
class1.MethodThree(); 
class1.MethodFour(); 

我知道一個可以隱式調用從一個接口,例如

IInterface.MethodTwo<Type,Type>(string name) 
{ 
    //Do stuff here 
} 

不過的方法,我想阻止所有的鑄造時在ClassOne中調用這些方法本身,因爲這只是我眼中的刺。我喜歡我的代碼清潔,這對我來說根本不乾淨。我想過一個抽象類,但是我的類是從另一個類繼承的。隨着接口我可以做

public ClassOne : ClassTwo, IInterface<Type1,Type2> 

當我這樣做與抽象類,但Visual Studio說預計接口。任何見解都非常受歡迎和讚賞,因爲我希望通過使我的生活和開發人員的生活變得更加容易,這些開發人員必須使用我的代碼。

在此先感謝!

編輯:場景是可以有幾個類,如ClassOne基本上做同樣的事情,但他們使用不同的類型,因爲他們必須返回的對象具有不同的值。但是堆積到這些對象是多於或相同e.g少:

  1. 收集所有API數據
  2. 檢索列表導出到API和呼叫#3或#4根據類型。
  3. 導出類型1的API
  4. 導出類型2的API

的想法始終是相同的,但自然也不同的API將需要不同的變量。但爲了確保所有步驟都像之前一樣,我希望實現一個接口或其他東西,但步驟1,2和3應該是私有的或者受保護的,並且只有步驟2應該可供使用它的類使用。但是,如果我只將方法2放在界面中,我無法確定其他人會執行1,3 & 4.這就是這裏的目標:P。這雖然ClassOne也從另一個類繼承,而不僅僅是接口。

編輯2:我知道接口只提供公共方法,這就是爲什麼我正在尋找替代品,因此這個問題。我知道它有什麼問題,我只是不明白我能如何以我想要的方式獲得它。感謝迄今的回覆!

編輯3:界面目前看起來像這樣,我只是爲了舉例調整了變量名稱。

public interface IExport<in T, in TU> 
    { 
     void GetRequiredApiData(); 

     bool MethodOne(List<Type> list); 

     bool ExportOne(T one); 

     bool ExportTwo(TU two); 

     bool ValidateExport(); 
    } 
+0

這很難理解你在說什麼。你正在談論第一段中的界面,但不知怎的,它會變成班級中期的句子。這個類('ClassOne'我假設)有一些方法想要隱藏消費代碼。你能否詳細說明爲什麼讓這些會員私人或保護不起作用?另外,什麼是「ClassThree」?這是消費代碼嗎? –

+0

增加了額外的解釋,希望現在更清楚! – Citroenfris

+0

接口中的所有方法都是公共的,通過設計,您只能從1個類繼承數據(即使它是抽象的)。 希望這可以幫到你 – darkndream

回答

1

其他三種方法應該只叫你的公開法裏面,或者讓你的第一種方法的私人/保護,並呼籲所有4內的一個公共方法。

接口的要點就是完全隱藏對你有什麼問題 - 調用者不需要知道的其他三種方法。

我懷疑你需要按特定的順序在不同的特定時間調用這三種方法。如果是這種情況,那麼你有代碼味道。這些方法可能只是具有副作用和改變全局狀態的void子例程。代碼需要被重構爲不只是一系列的子程序,而且對象需要以不同的方式分解。

+0

在我的課堂上,我有幾個屬性是對象列表。這些由Get類中的類方法(它是繼承的)中的第一個方法填充。這個Get類調用靜態的Request類,它持有通用的方法來進行API調用,同時提供所需的類型等。然後,我可以使用這些值來查看它們是否實際上可用於我定位的API中,否則就會發生錯誤的請求。一旦這些驗證通過,我可以將所述對象導出到API。有什麼辦法可以改善這種邏輯嗎? – Citroenfris

+0

將所需的類型參數放在方法上,而不是對象本身。這樣你可以保持你的繼承結構,而不需要插入類型參數。 – moarboilerplate