如何获取类型的所有功能而不将其暴露给客户端?

时间:2016-03-17 16:28:12

标签: c# oop encapsulation

我刚从老师那里遇到麻烦,我有点困惑。

我的数据存储在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 个答案:

答案 0 :(得分:2)

在这种情况下,Vector<T>是一个不可变类型,甚至不能通过引用传递。如果您的字段定义保持只读,那么暴露它就没有危险。如果不使用反射黑客,它就不能被另一个对象更改。

可以提出Vector<T>是一个特定于实现的详细信息,可能在将来发生变化,而VectorsWithTops<T>类的消费者不应该依赖该领域保持不变。但除非你是一个受虐狂,否则我不会再为Vector<T>添加一个公共的getter / property。如果在某些时候您需要将私有字段更改为其他数据结构,则可以在此时修改公共属性以执行转换。

另一方面,有时你只需要做老师想要通过课程的内容......