2016-03-17 24 views
0

我剛從一位老師遇到麻煩,我有點困惑。如何獲得某種類型的所有功能而不將其暴露給客戶端?

我有存儲在VectorWithTops類這樣

public class VectorWithTops<T> 
{ 
    private readonly Dictionary<T, int> TopsWithIndices = 
     new Dictionary<T, int>(); 
    private readonly Vector<double> _data; 

    public VectorWithTops(
     List<T> topHeaders, 
     Vector<double> data) 
     { 
      // set TopsWithIndices to be topHeaders and index in vector 
      // ... 

      _data = data 
     } 

    // method to get value in vector at certain topHeader index 
    // ... 
} 

這個類的全部目的是能夠通過將其各自的T類型的報頭,以訪問一個向量的索引數據。但是矢量本身並沒有暴露給客戶端。

現在我有一個不同的類,其中我使用了VectorWithTops,並且爲了對我的向量執行一堆操作,我決定在公開方法中公開_data,然後直接對矩陣進行操作。我認爲這很好,因爲_data是私人只讀,所以它不會被改變。

我的老師有點失去了理智,在這一點,並告訴我,我應該做的是運營商添加到我的VectorWithTops類例如

static Vector<double> operator *(VectorWithTops<T> leftSide, Vector<double> rightSide) 
{ 
    return leftSide._data*rightSide; 
} 

那麼我可以用這個靜態方法不暴露實際矢量到客戶端。 我的問題是然後如果我需要一個偉大的交易我的向量的運算符方法,甚至矩陣,這個封裝如何工作?我是否必須在自己的課程中重寫所有這些靜態方法,以確保數據在我的課堂上進行操作?我明白我的老師對我的案例中的矢量曝光的投訴,但是我應該如何在VectorWithTops之內自由操作我的矢量呢?

+1

在現實世界中,你會用向量,但是你在一個教室裏,所以你才必須不管你的老師說什麼,即使它只是一種憎惡...... – Gusman

+0

@古斯曼爲什麼它是一種可憎的,但他的建議?在我看來,有一些重要的可能是不暴露載體本身? – HavelTheGreat

+0

這句話只是一般性的,並不嚴格對待這段代碼。但是,你在談論矩陣,向量等等,所以這段代碼聞起來像某種類型的3d程序,這是一個非常計算密集型的任務,封裝所有的操作符會減慢速度,所以*也許*是可憎的。 – Gusman

回答

2

在這種情況下,Vector<T>是一個不可變的類型,它甚至不被引用傳遞。假設你的字段定義保持只讀,暴露它沒有危險。它不能被另一個對象改變而不使用反射黑客。

可以使論點,即Vector<T>是具體實現的細節,可能會在未來發生變化,您VectorsWithTops<T>類的消費者不應該依賴於保持不變的那場。但除非你是一個受虐狂,否則我不會再爲Vector<T>添加一個公共獲得者/財產。如果在某個時候您需要將您的私有字段更改爲另一個數據結構,則可以在此時修改公共屬性以執行轉換。

在另一方面,有時你只是愛做老師想通過全班...

相關問題