数学上有理数可以分为整数和分数,都能进行加法运算。如何表示这种关系?
0.
分数继承自整数肯定是不对的。
分数代入 整数.加(整数, 整数) 方法进行运算,明显违反里氏代换原则。
1.
有理数作为父类,整数和分数分别继承自有理数。
为整数类实现方法 整数.加(整数, 整数);
为分数类实现方法 分数.加(分数, 分数);
现要实现有理数加法 有理数.加(有理数, 有理数),
当然就包括 加(整数, 分数)这种情况,
如果在 有理数.加 方法里进行类型判断,
就导致父类耦合子类的问题了。
2.
有理数作为联合体,作为整数和分数的包装。
分数类有属性 分子、分母,而整数没有,
有理数类里要不要实现属性 分子、分母呢?
如果实现那么就可以访问整数的“分子、分母”,从而引发混乱。
(或者类似于F#的“可区分联合”?)
------解决思路----------------------
为什么说
Interface 有理数肯定不能用呢?因为它这个操作无法表达“二元运算”概念。
{//定义规范
double Add();
}
在子类的“有理数 整数.加(有理数)”和“有理数 分数.加(有理数)”这里才能进行所谓的“类型判断”。这体现了子类重写父类方法、扩展父类功能实现的特点。
继承,不是为了省点写代码的事情。有些程序员为了省得写点代码而使用继承,那绝对是要不得的。继承是为了进行大系统的设计,只有举出更有意义的“面向应用领域的”实例时才会看得更清楚,也能体现出价值。而在非常低的层次,可以使用最笨最原始的办法写程序而不必花精力过分抽象。
------解决思路----------------------
从逻辑上说,包含/子集的关系可以用继承表示,但是从实现上说,这样做有没有必要,性能上是否太低则是需要考虑的。
就好比从逻辑上说,没有必要有字符串这种类型,字符串就是数组,甚至没有必要有数组这种类型,数组就是以自然数为下标的字典。但是任何编程语言都有字符串这种特异化的类型。
------解决思路----------------------
我觉得你是从数学上进行抽象的时候就不对,导致用程序实现的时候也很混乱
整数和分数是毫无关系的2个类型?
明明分数就是有理数,而整数不过是一种特殊的分数(分子能够整除分母的分数)