从抽象结构转换为具体结构

我在 Go 中遇到了一个轻微但很烦人的问题。我有一个用于项目的抽象结构,然后我将其用于具体结构。下面是一个例子:

type Abstract struct {
  ID uint64
  Name string

  Update func()
}

type Concrete struct {
  Abstract
  Description string
}

当我使用我的对象时,我总是使用抽象结构(考虑到我有大约 10 个基于它的具体结构)。一个例子:

func DoSomething(abstract Abstract) {
}

但是...假设我想访问在具体结构上定义的属性/函数。我将如何从抽象结构转换为具体结构?

我试过这个:

concr, valid := abstract.(*Concrete)

但这要求抽象结构是一个接口,但它不能是一个接口,因为那些不允许属性/变量。

有什么办法可以解决这个问题吗?我看到的唯一方法会让我很头疼,那就是将 Abstract 变成一个接口,然后让我的所有具体对象自己定义属性/变量。那里有很多重复的代码,这可能会导致意外的维护问题。

回答

首先,Go 中没有抽象结构。所有的结构都是具体的。您正在做的是嵌入,而不是继承。封闭结构不是封闭结构的实例,它包含它。

解决这个问题的方法是为 Go 制定解决方案,而不是为具有继承性的语言制定解决方案。一种方法是使用接口:

type Intf interface {
   GetID() int64
   GetName() string
}

然后在Abstract结构体中实现这些功能:

func (a Abstract) GetID() int64 {...}
func (a Abstract) GetName() string {...}

然后你可以这样做:

type Concrete struct {
   Abstract
   // More fields
}

在此之后,Concrete实现 interface Intf,您可以编写一个doSomething(Intf)函数并将Concrete实例传递给它。

  • Your attitude is not helpful. Go is actually much easier to learn compared to other languages. You are making the same mistake many did before you: you are trying to do things the way you know instead of learning how those things are done in Go. Go is *not* an object-oriented language.

以上是从抽象结构转换为具体结构的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>