【发布时间】:2021-02-21 14:15:13
【问题描述】:
我正在尝试在 C# 中为 2 个类定义运算符重载:Fraction 和 BasicFraction。
在外部,它们的行为相同,但在内部 Fraction 使用 PrimeFactorization(将数字存储为质因数列表),BasicFraction 使用 int 存储提名和分母。
他们会遵循这个接口(如果我使用 JSDoc 类型定义):
public interface IFraction
{
public (int|Primefactoriztion) a; // nominator
public (int|Primefactoriztion) b; // denominator
}
但既然我不能这样做,有没有一种简单的方法可以互换使用 Fraction 和 BasicFraction?
我可以定义所有运算符重载来评估int 和PrimeFactorization 之间的交互。但是,我不知道如何告诉 C# 接受两者都传递给方法。
Tl;dr:如何让一个属性允许 2 种数据类型?
注意事项:
- 我是高级 C# 的新手(我知道静态类型和基本的 OOP,但仅此而已)。我来自 JS 和 Python 背景。
- 我知道它们可能是具有此功能的优秀库。我写这篇文章是为了学习 C#,而不是为了生产。
编辑:
目前,PrimeFactorization 将因子及其幂存储在Dictionary<int, BasicFraction> 中(我会使用Fraction,但它会导致递归;这基本上是BasicFraction 的唯一用法)。
【问题讨论】:
-
搜索
c# Generics。 -
你能解释一下吗。你想让你的类的一种方法返回不同的类型吗?或者您想要一种方法获取两种不同的类型作为输入,但返回相同的类型?
-
@Ivan Khorin 简而言之,我想以不可更改的方式使用两个我知道具有兼容接口但无法定义编译器接口的类
-
请注意,将 1 个属性用于 2 种数据类型的想法在 C# 中是不的。虽然有几种方法可以做到这一点,但 C# 的心态是应尽可能依赖类型系统来维护正确的代码