110,499
社区成员
发帖
与我相关
我的任务
分享
class Integer : Rational
{
public static Integer operator +(Integer left, Integer right)
}
class Fraction: Rational
{
public static Fraction operator +(Fraction left, Fraction right)
}
abstract class Rational
{
public static Rational operator +(Rational left, Rational right)
{
if (left is Integer && right is Integer)
return (Integer)left + (Integer)right;
else if (
(left is Fraction && right is Integer) ||
(left is Integer && right is Fraction) ||
(left is Fraction && right is Fraction)
)
return ((Fraction)left + (Fraction)right).Normalize();
else
throw new ArithmeticException("未知的类型");
}
}
结果是有理数的方法里要判断类型,父类耦合子类。
关键问题是整数和分数的具体运算实现是不一样的,
就要能判断一个有理数是整数还是分数。
如果用您的方法,
整数加分数这种情况,.Plus(有理数 x) 方法里还是要判断x是整数还是分数。
整数类耦合分数类了。
而且分数+分数可能是整数,就有类型转换的问题。
分数.Plus(有理数 x) 方法里要判断结果是不是整数,如果是整数就要转成整数,
也就是分数类就要耦合整数类了。
有什么方法避免这种耦合关系呢?
Interface 有理数
{//定义规范
double Add();
}
肯定不能用呢?因为它这个操作无法表达“二元运算”概念。
在子类的“有理数 整数.加(有理数)”和“有理数 分数.加(有理数)”这里才能进行所谓的“类型判断”。这体现了子类重写父类方法、扩展父类功能实现的特点。
继承,不是为了省点写代码的事情。有些程序员为了省得写点代码而使用继承,那绝对是要不得的。继承是为了进行大系统的设计,只有举出更有意义的“面向应用领域的”实例时才会看得更清楚,也能体现出价值。而在非常低的层次,可以使用最笨最原始的办法写程序而不必花精力过分抽象。abstract class 有理数
{
public abstract 有理数 Plus(有理数 x);
}
class 整数 : 有理数
{
public override 有理数 Plus(有理数 x)
{
throw new NotImplementedException();
}
}
class 分数 : 有理数
{
public override 有理数 Plus(有理数 x)
{
throw new NotImplementedException();
}
}
Interface 有理数
{//定义规范
double Add();
}
Interface 整数:有理数
{//整数特有的
}
Interface 分数:有理数
{//分数特有的
double 分子{get;}
double 分母{get;}
}