我剛從一位老師遇到麻煩,我有點困惑。如何獲得某種類型的所有功能而不將其暴露給客戶端?
我有存儲在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
之內自由操作我的矢量呢?
在現實世界中,你會用向量,但是你在一個教室裏,所以你才必須不管你的老師說什麼,即使它只是一種憎惡...... – Gusman
@古斯曼爲什麼它是一種可憎的,但他的建議?在我看來,有一些重要的可能是不暴露載體本身? – HavelTheGreat
這句話只是一般性的,並不嚴格對待這段代碼。但是,你在談論矩陣,向量等等,所以這段代碼聞起來像某種類型的3d程序,這是一個非常計算密集型的任務,封裝所有的操作符會減慢速度,所以*也許*是可憎的。 – Gusman