C# – 使用inheritance和运算符重载设计类
我有两个类代表一种特殊的数值。 我们称之为“价值”和“分数”; 分数由Value类型的分子和分母组成。 因为这些是数值,所以运算符重载(+ – * /)很有意义。 鉴于价值的本质,除法返回一个分数。 可以使用值和分数的混合来执行操作。
目前,我刚刚定义了一个从Value to Fraction的隐式转换运算符(以及从Fraction到Value的显式运算符,虽然我没有使用它),并且我没有使用任何类型的inheritance。
我想知道是否有任何“优雅”的方式来定义两个定义可用操作集的抽象基类,并调用适当的操作。 效率是一个问题。 我宁愿在必要时仅使用Fraction,而且当它们可以使用相同的语法表达时,不必分别为这两种情况定义更复杂的操作。
我可以看到的一种方法是为每个操作执行以下操作,但我想知道是否有更好的方法来执行此操作?
public static AbstractValue operator *(AbstractValue a, AbstractValue b) { Value valA = a as Value; Value valB = b as Value; if(valA == null) { Fraction fractA = a as Fraction; if(valB == null) { Fraction fractB = b as Fraction; return fractA * fractB; } return fractA * valB; } if(valB == null) { Fraction fractB = b as Fraction; return valA * fractB; } return valA * valB; }
如果你的基类必须做一些事情,比如试图转换为子类型并检查它是否有效,这表明基类不应该实现这个方法。 理论上,基类不应该知道任何特定的子类。
根据您提议的实现,如果要添加另一个子类,则需要编辑基类。 整个inheritance点是您可以添加新类型而无需编辑现有对象。
实际上,我会看到最“优雅”的方式分别定义每个变体。
优点:
- 选择正确的计算是由编译器在编译器时(应该在哪里完成)而不是在运行时完成的。
- 每种计算方法仅包含计算代码。
缺点:
- 这是更多的代码(只是学习friggin’类型)
那么,让我们看看,你有:
- 分数运算分数
- 分数值
- 价值运营分数
- 价值观价值
时间4次操作,总共只提供了16种方法,每种方法可能大约一行。