继承不是一个很好的例子,因为这两个的绝对值计算方式不同
实际上,这并不是反对所有继承的令人信服的原因,只是建议的class RealNumber
<-> class ComplexNumber
模型。
您可能会合理定义一个接口Number
,该接口和接口都 将实现。RealNumber
ComplexNumber
可能看起来像
interface Number
{
Number Add(Number rhs);
Number Subtract(Number rhs);
// ... etc
}
但是随后您希望将Number
这些操作中的其他参数限制为与相同的派生类型this
,您可以通过
interface Number<T>
{
Number<T> Add(Number<T> rhs);
Number<T> Subtract(Number<T> rhs);
// ... etc
}
或者,您将使用允许结构多态性而不是子类型多态性的语言。对于数字的特定情况,您可能只需要能够重载算术运算符。
complex operator + (complex lhs, complex rhs);
complex operator - (complex lhs, complex rhs);
// ... etc
Number frobnicate<Number>(List<Number> foos, Number bar); // uses arithmetic operations