我刚从一位老师遇到麻烦,我有点困惑。如何获得某种类型的所有功能而不将其暴露给客户端?
我有存储在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