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种方法,每种方法可能大约一行。