gpt4 book ai didi

C# - 使用继承和运算符重载设计类

转载 作者:行者123 更新时间:2023-11-30 17:21:29 24 4
gpt4 key购买 nike

我有两个类代表一种特殊的数值。我们称一个为“值”,一个为“分数”;分数由 Value 类型的分子和分母组成。因为这些是数值,运算符重载 (+ - */) 很有意义。鉴于 Value 的性质,除法返回一个 Fraction。可以使用值和分数的组合来执行操作。

目前,我刚刚定义了一个从值到分数的隐式转换运算符(以及一个从分数到值的显式转换运算符,尽管我没有使用它),并且没有使用任何类型的继承。

我想知道是否有任何“优雅”的方法可以根据定义可用操作集的抽象基类来定义两者,并调用适当的操作。效率是一个问题。我宁愿只在必要时使用 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;
}

最佳答案

如果您的基类必须做一些事情,例如尝试转换为子类型并检查它是否有效,这表明基类不应实现此方法。理论上,基类应该不知道任何特定的子类。

对于您提出的实现,如果您想添加另一个子类,您将需要去编辑基类。继承的全部意义在于您可以添加新类型而无需编辑现有对象。

关于C# - 使用继承和运算符重载设计类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3415484/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com