2016-03-17 25 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>添加一个公共获得者/财产。如果在某个时候您需要将您的私有字段更改为另一个数据结构,则可以在此时修改公共属性以执行转换。

在另一方面,有时你只是爱做老师想通过全班...

相关问题