非抽象方法也将破坏里氏替换原则。我一开始想要试试继承其实是一种偷懒的行为,因为我并不想重构已有的那么一大坨代码。
但是我们不应该害怕重构。你看,就算我想试着逃避重构,还是掉进别的沟里了。
如果能重来,我要选李白。。。呸,如果能让我重构已有代码的话,也许我可以试试接口。在Go语言中,接口非常灵活,是实现多态的手段。
package main
import (
"fmt"
)
func main() {
user := &User{name: "Chris"}
user.ISubUser = &NormalUser{}
user.sayHi()
user.ISubUser = &ArtisticUser{}
user.sayHi()
}
type ISubUser interface {
sayType()
}
type User struct {
name string
ISubUser
}
func (u *User) sayHi() {
u.sayName()
u.sayType()
}
func (u *User) sayName() {
fmt.Printf("I am %s.", u.name)
}
type NormalUser struct {
}
func (n *NormalUser) sayType() {
fmt.Println("I am a normal user.")
}
type ArtisticUser struct {
}
func (a *ArtisticUser) sayType() {
fmt.Println("I am an artistic user.")
}
I am Chris.I am a normal user.
I am Chris.I am a artistic user.
这样我就重用了sayName和sayHi方法,并且把sayType方法留给多态来实现。
完美。