【发布时间】:2018-03-06 20:35:52
【问题描述】:
包term:
type Num interface {
IsNeg() bool
Add(Num) Num
}
type Term struct {
Coeff Num
Var string
}
外包frac64
type Frac64 struct {
Numer uint64
Denom uint64
Neg bool
}
func (a Frac64) Add(b Frac64) Frac64 { // Pretend this is implemented }
包client
type Frac Frac64
func (f Frac) IsNeg() bool { return f.Neg }
func (f Frac) Add(v Num) Num { // Call Frac64's Add here? }
我将如何为Frac 实现Add 以便它实现Num 接口?
编辑:附加信息
外部包frac64 只是一个例子。我不打算使用它。
这里的目标(我应该更清楚)是让我的包公开使用Num 作为其两个属性之一的结构Term。现在,我希望我的包的用户能够使用big.Rat 或Frac64 或int64 或rune 或任何他们想要的,只要他们实现Num 接口。
我遇到的问题是尝试为已经具有与Num 中的函数同名的函数的结构实现Num 接口。这就是Frac64 的用武之地。我也可以使用big.Rat 作为示例,因为它还有一个名为Add 的函数。
我无法更改Frac64(或big.Rat)的实现,也无法使用Add 函数对其进行扩展,因为它已经存在。这就是为什么我尝试使用type Frac Frac64(或type Frac big.Rat)然后尝试扩展Frac。
我无法为Frac 实现Num,因为我无法从Frac 的Add 函数调用Frac64 的Add。
【问题讨论】:
-
Plus和Term从未被引用。我不清楚你想要完成什么。一些代码来显示您希望它如何工作会有所帮助。 -
您是否将
Ratfrom the big package 重新实现为练习? -
我应该在原帖中写下更多信息。我试图创建一个展示我的问题的最小示例。结构本身可以是任何东西。使用 Frac64,我尝试使用 Add 函数创建一个不可变结构的最小示例。在客户端中,我正在尝试为 Frac 实现 Num 接口,这是一个 typedef Frac64,它还具有与 Num 的 Add 不匹配的 Add 函数。
-
我基本上希望将我的包与
Term结构一起使用的人能够使用他们认为适合用作系数的任何结构,只要它实现了 Num。 -
接口不完整,恕我直言。如果 Add 方法的参数不是 Frac64,如何捕获案例?你如何转换它?还是返回错误?您应该添加一个方法来获取数字的两个部分或将其转换为 ex。