如何在不将类型暴露给客户端的情况下获得类型的所有功能?
How to get all the functionality of a type without exposing it to the client?
刚刚遇到老师的麻烦,有点迷糊。
我有这样的 VectorWithTops
class 存储的数据
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
// ...
}
此 class 的全部目的是能够通过其各自的 header 类型 T
访问向量索引。但是,矢量本身不会暴露给客户端。
现在我有一个不同的 class,我在其中使用 VectorWithTops,为了对我的向量执行一系列操作,我决定在 [=41= 中公开 _data
] 方法,然后直接对矩阵进行操作。我认为这很好,因为 _data
是私有只读的,因此无论如何都无法更改。
我的老师对此有点失去理智,并告诉我我应该做的是将运算符添加到我的 VectorWithTops
class 例如
static Vector<double> operator *(VectorWithTops<T> leftSide, Vector<double> rightSide)
{
return leftSide._data*rightSide;
}
然后我可以使用这个静态方法,而不用将实际向量暴露给客户端。 我的问题是如果我需要大量 运算符方法用于我的向量,甚至是矩阵,这种封装将如何工作?我是否必须在我自己的 class 中重写所有这些静态方法,以确保在我的 class 中操作数据?我理解我的老师抱怨我的案例中的矢量被暴露了,但是我应该如何在 VectorWithTops
中自由操作我的矢量?
在这种情况下,Vector<T>
是一个不可变类型,甚至不通过引用传递。如果您的字段定义保持只读状态,那么公开它就没有危险。如果不使用反射 hack,它不能被另一个对象更改。
你可以提出这样的论点,即Vector<T>
是一个特定于实现的细节,将来可能会改变,你的VectorsWithTops<T>
的消费者class 不应依赖该字段保持不变。但是除非你是一个受虐狂,否则我只会为 Vector<T>
添加一个 public getter/property。如果在某个时候你需要将你的私有字段更改为另一个数据结构,那么 public 属性 可以在那个时候被修改以执行转换。
另一方面,有时候你只需要按照老师的要求去做就可以通过 class...
刚刚遇到老师的麻烦,有点迷糊。
我有这样的 VectorWithTops
class 存储的数据
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
// ...
}
此 class 的全部目的是能够通过其各自的 header 类型 T
访问向量索引。但是,矢量本身不会暴露给客户端。
现在我有一个不同的 class,我在其中使用 VectorWithTops,为了对我的向量执行一系列操作,我决定在 [=41= 中公开 _data
] 方法,然后直接对矩阵进行操作。我认为这很好,因为 _data
是私有只读的,因此无论如何都无法更改。
我的老师对此有点失去理智,并告诉我我应该做的是将运算符添加到我的 VectorWithTops
class 例如
static Vector<double> operator *(VectorWithTops<T> leftSide, Vector<double> rightSide)
{
return leftSide._data*rightSide;
}
然后我可以使用这个静态方法,而不用将实际向量暴露给客户端。 我的问题是如果我需要大量 运算符方法用于我的向量,甚至是矩阵,这种封装将如何工作?我是否必须在我自己的 class 中重写所有这些静态方法,以确保在我的 class 中操作数据?我理解我的老师抱怨我的案例中的矢量被暴露了,但是我应该如何在 VectorWithTops
中自由操作我的矢量?
在这种情况下,Vector<T>
是一个不可变类型,甚至不通过引用传递。如果您的字段定义保持只读状态,那么公开它就没有危险。如果不使用反射 hack,它不能被另一个对象更改。
你可以提出这样的论点,即Vector<T>
是一个特定于实现的细节,将来可能会改变,你的VectorsWithTops<T>
的消费者class 不应依赖该字段保持不变。但是除非你是一个受虐狂,否则我只会为 Vector<T>
添加一个 public getter/property。如果在某个时候你需要将你的私有字段更改为另一个数据结构,那么 public 属性 可以在那个时候被修改以执行转换。
另一方面,有时候你只需要按照老师的要求去做就可以通过 class...