2014-10-11 67 views
4

我正在学习C#并决定为矩阵及其功能编写一个类库以获得一些经验和实践。设计良好的类和层次结构

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

class Matrix // For rectangular matrices 
{ } 

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

每个类的具有合适的构造采取尺寸或特定矩阵的顺序。

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

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


所以我的问题是:

  1. 是我的一流的设计缺陷?
  2. 有什么办法可以解决这个问题吗? (OR(尽管它有一个难得的机会),我应该还是期待用户正确实例化对象?)

谢谢大家提前:)

+1

没有完美的解决方案,这种关系在继承方面表现不佳。参见[圆椭圆问题](http://en.wikipedia.org/wiki/Circle-ellipse_problem)。 – 2014-10-11 06:59:16

+0

真的很好链接,谢谢! – crazyGamer 2014-10-11 13:05:35

+0

那么当然最简单的解决方案就是简单地抛弃所有的继承,并有异常或布尔返回来检查有效性。但是,这不是真正的OOP是... – crazyGamer 2014-10-11 13:22:23

回答

1

什么你作战反对这里是里氏替代原则。基本上你需要做的不是使用旧的“...是...”来制定超级/子类。而是尝试使用“...可替代...”

如果您刚刚开始使用C#,则应首先了解SOLID的原理。关于你回答的工作和L

这将帮助你与L,http://www.oodesign.com/liskov-s-substitution-principle.html

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

当你想对我和d工作打我,他们是我的最爱

戴尔

1

不错的问题。

我会认为:

用户应该负责实例化正确的实例。如果用户想要Matrix,那么他就是这样。如果该功能在Matrix中不存在,那就太糟糕了。

但是,如果你有一个共同的功能,根据它是什么类型的矩阵表现不同,那么在这种情况下,你会创建一个返回矩阵的工厂。它会根据参数返回适当的矩阵。用户可以在Matrix上调用函数,但根据实际返回的矩阵,行为实际上会有所不同。

+0

好主意。所以我可以使所有构造函数都是私有的,并有另一个静态成员来实例化并返回适当类型的矩阵。但是,那么我会不要求用户使用“动态”创建对象来允许这样做?并且动态没有轻微的性能打击? – crazyGamer 2014-10-11 13:09:59