毋庸置疑,golang是一门相当好的语言,稍微用得不太顺手的地方就是没有语法层面的抽象类支持。但这也不是完全没有解决办法,利用接口和组合继承,可以实现抽象类。
Java中一段抽象类代码如下:
public abstract class People {
public String name;
public int age;
abstract void run();
}
class User {
public void usePeople(People p) {
System.out.println(p.name);
System.out.println(p.age);
p.name = "Alice";
p.age += 1;
p.run();
}
}
由于golang中的结构体不支持抽象方法,而接口不能有字段,因此可以用如下方法实现抽象类:
type IPeople interface {
GetName() string
SetName(string)
GetAge() int
SetAge(int)
Run()
}
type AbstractPeople struct {
IPeople
name string
age int
}
func (a AbstractPeople) GetName() string {
return a.name
}
func (a *AbstractPeople) SetName(newName string) {
a.name = newName
}
func (a AbstractPeople) GetAge() int {
return a.age
}
func (a *AbstractPeople) SetAge(newAge int) {
a.age = newAge
}
// user.
func UsePeople(p IPeople) {
fmt.Println(p.GetName())
fmt.Println(p.GetAge())
p.SetName("Alice")
p.SetAge(p.GetAge() + 1)
p.Run()
}