Tại sao Golang thích sáng tác hơn là thừa kế?

Nov 06 2022
Go thường được coi là một ngôn ngữ hướng đối tượng nhưng nó chỉ là một thứ khác đằng sau hậu trường. Thông thường, trong các ngôn ngữ hướng đối tượng, kế thừa được sử dụng nhưng trong Go thành phần được ưu tiên hơn, đây là lý do tại sao: Các vấn đề với kế thừa: (i) Phân cấp lớn (ii) Kết hợp chặt chẽ Hãy thảo luận về kế thừa: Kế thừa: Nó tương ứng với các mối quan hệ “là một”.

Go thường được coi là một ngôn ngữ hướng đối tượng nhưng nó chỉ là một thứ khác đằng sau hậu trường. Thông thường, trong các ngôn ngữ hướng đối tượng, kế thừa được sử dụng nhưng trong Go thì thành phần được ưu tiên hơn, đây là lý do tại sao:

Các vấn đề với kế thừa:

(i) Hệ thống phân cấp lớn (ii) Khớp nối chặt chẽ

Hãy thảo luận về thừa kế:

Di sản:

Nó tương ứng với các mối quan hệ "là một". Hãy lấy một ví dụ về một loài động vật có thuộc tính ăn và ngủ, Vì vậy, các lớp kế thừa có thể có từ động vật có thể là chó, người và cá. Các thuộc tính hiện tại có thể đi cùng với các lớp kế thừa nhưng nếu một thuộc tính đi bộ được thêm vào các thuộc tính hiện tại, bạn có nghĩ rằng điều này sẽ ổn không, câu trả lời đơn giản cho nó là “Không” vì cá không có khả năng đi bộ, một giải pháp đơn giản có thể là tạo các danh mục cho từng loại nếu chúng ta vẫn muốn sử dụng tính kế thừa. Nó sẽ trông giống như thế này:

Vấn đề với điều này là mỗi khi chúng ta muốn thêm một thuộc tính mới, chúng ta sẽ phải nối nó vào các lớp đã được xác định. Đây là nơi bố cục xuất hiện:

Thành phần:

Nó tương ứng với mối quan hệ "có một". Bây giờ chúng ta có thể xác định các thuộc tính theo cách mà động vật có khả năng "sống", nghĩa là nó có thể ăn và ngủ, chúng ta cũng có thể xác định các thuộc tính có thể đi lại và bơi được tùy thuộc vào khả năng của động vật. Vì duy trì các mối quan hệ “có một” dễ hơn duy trì các mối quan hệ “là một”, đó là lý do tại sao bố cục được ưu tiên trong cờ vây.

Đây là cách bố cục có thể được triển khai trong Go:

package main

import "fmt"

type alive struct {
}
type walkable struct {
}
type swimable struct {
}
type duck struct {
a alive
w walkable
s swimable
}

func (d duck) eat() {
d.a.eat()
}
func (d duck) sleep() {
d.a.sleep()
}
func (d duck) walk() {
d.w.walk()
}
func (d duck) swim() {
d.s.swim()
}
func (alive) eat() {
fmt.Println("Alive and eating")
}
func (alive) sleep() {
fmt.Println("Alive and sleeping")
}
func (walkable) walk() {
fmt.Println("strolling through")
}
func (swimable) swim() {
fmt.Println("Taking a dip")
}
func main() {
d := duck{}
d.eat()
d.sleep()
d.walk()
d.swim()
}

      
                

© Copyright 2021 - 2022 | vngogo.com | All Rights Reserved