객체 지향 사람들을 위한 Golang
불에 연료를 추가하기 위해 유형 계층이 없습니다(즉, 상속 없음). 이것은 아마도 다른 객체 지향 언어와 비교할 때 가장 큰 차이점일 것입니다. 사실 it can't be truly considered an object-oriented language .
자, 유형 계층 구조에 대해 이야기해 보겠습니다.
유형 계층이 없는 것은 golang에서 의도적인 디자인 선택이었습니다. 유형 계층 구조는 깨지기 쉬운 코드를 생성합니다. 계층 구조는 종종 프로그램 설계의 첫 번째 단계로 초기에 설계되어야 하며 초기 결정은 프로그램이 작성되면 변경하기 어려울 수 있습니다. 결과적으로, 이 모델은 프로그래머가 소프트웨어가 요구할 수 있는 모든 가능한 사용을 예측하려고 시도할 때 조기 과설계를 조장하고 만일을 대비하여 유형 및 추상화 계층을 추가합니다. 이것은 거꾸로입니다. 시스템의 조각이 상호 작용하는 방식은 초기에 고정된 것이 아니라 성장함에 따라 적응해야 합니다. - Source
type embedding 을 간단히 살펴보겠습니다. 처음에는 상속을 구현하기 위한 메커니즘인 것처럼 보이지만 자세히 살펴보면 그렇지 않다는 것이 분명해집니다. 구현의 일부를 차용하는 도구일 뿐입니다.
예를 들어 아래 코드를 살펴보십시오.
type Animal struct {
Name string
}
type Dog struct{
Animal
}
// Firstly, you can't just instantiate a Dog struct by
// passing in the field "Name".
// d := Dog{Name:"dog"}
// This is the proper way to instantiate a Dog struct
d := Dog{Animal: Animal{Name: "dog"}}
// Next, you might want to employ polymorphism by
// creating a variable of type Animal,
// and assigning the dog struct to it.
// Again, doesn't work. Just because you "embedded"
// the Animal struct inside the Dog struct
// doesn't create a type hierarchy.
// var a Animal;
// a = Dog{Animal : Animal{Name:"dog"}}
임베딩이 유형 계층을 생성하지 않는다는 것은 분명합니다.
Name
를 수행하여 d.Name
필드에 계속 액세스할 수 있습니다. 포함된 필드와 메서드가 외부 구조체로 "승격"되기 때문입니다.좋아, 그래서 유형 계층이 없다면 임베딩이 생성하는 것처럼 보이지만 그렇지 않은 경우 추상화를 나타내기 위해 구조체를 그룹화하는 방법은 무엇입니까? 예를 들어, Animal 슈퍼 클래스와 Cat, Dog 하위 클래스를 만들어 다른 OOP 언어에서와 같이 "동물"추상화로 고양이와 개를 함께 그룹화하는 방법은 무엇입니까?
답변: 구조체는 유형이 아니라 동작(예: 인터페이스)에 따라 그룹화됩니다.
인터페이스
인터페이스는 메소드의 집합일 뿐입니다. 이러한 메서드를 구현하는 모든 형식은 이 인터페이스를 암시적으로 충족합니다. 아이디어는 유형 계층을 정의하지 않고도 다양한 구체적인 유형 값의 추상화를 만들고 공통 동작을 통해 값으로 작업할 수 있다는 것입니다. Here's 방법을 설명하는 좋은 예입니다.
또한 인터페이스를 사용하면 dependency inversion principle . accept interfaces and return structs으로 이동하는 것이 좋습니다. 이런 식으로 코드는 구체적인 구현보다는 추상화에 의존합니다.
다른 언어의 인터페이스와 달리 해당 인터페이스를 만족하는 구체적인 유형을 구현하는 패키지에서 인터페이스를 선언하기 보다는 declare interfaces in the package where you're using that interface 을 권장합니다.
프로그래머가
생각해야 합니다 - 구조체를 유형이 아니라 행동으로 그룹화합니다.
물론, 하지만 모든 OOP 언어에는 인터페이스가 있습니다. golang에서 코드를 어떻게 재사용합니까?
상속보다 구성
임베딩 및 구성을 사용하여 golang에서 코드를 재사용합니다. favour composition over inheritance 객체 지향 프로그래밍에는 유명한 원칙이 있습니다.
다음은 go가 그 원칙을 구현하는 방법을 설명하는 nice article입니다.
Reference
이 문제에 관하여(객체 지향 사람들을 위한 Golang), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/makalaaneesh/golang-for-object-oriented-people-l7h텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)