设计好的类和层次结构

时间:2014-10-11 05:10:05

标签: c# class inheritance

我正在学习C#,并决定为矩阵及其功能编写一个类库,以获得一些经验和实践。

好的,现在我有以下类模型:

class Matrix // For rectangular matrices
{ }

class SquareMatrix : Matrix
{ }
class RowMatrix : Matrix
{ }
class ColumnMatrix : Matrix
{ }

每个类都有一个合适的构造函数来获取特定矩阵的维度或顺序。

现在,我的SquareMatrix类具有查找和返回行列式的特定功能。我在这里面临的问题是,如果我的库的用户创建了一个类型为Matrix且维度为n和n的实例,那么他将无法使用Determinant()方法,因为它只驻留在SquareMatrix中,而他的实例是Matrix类型

其他方法也可能出现类似的问题。


所以我的问题是:

  1. 我的班级设计有缺陷吗?
  2. 有没有办法解决这个问题? (或者(虽然它有一个难得的机会)我是否应该期望用户正确地实例化对象?)
  3. 提前谢谢大家:)

2 个答案:

答案 0 :(得分:1)

你在这里与之抗争的是Liskov Substitution原则。基本上你需要做的就是不要使用旧的“......是......”来制定超级/子类。而是尝试使用“......可替代...”

如果您刚开始使用C#,那么您的第一站应该是学习SOLID的原理。关于S和L的回答工作

这将为您提供L,http://www.oodesign.com/liskov-s-substitution-principle.html

检查一下SOLID,http://www.codeproject.com/Articles/703634/SOLID-architecture-principles-using-simple-Csharp

当你想要工作我和D打我,他们是我最喜欢的

戴尔

答案 1 :(得分:1)

好问题。

我想:

用户应负责实例化正确的实例。如果用户想要一个矩阵,那就是他得到的东西。如果Matrix中不存在该功能,那就太糟糕了。

但是,如果你有一个共同的函数,它的行为会有所不同,具体取决于它的Matrix类型,那么在这种情况下你将创建一个返回Matrix的工厂。它将根据参数返回相应的Matrix。用户可以在Matrix上调用该函数,但它的行为实际上会有所不同,具体取决于您实际返回的Matrix。