상속이없는 OO 언어가 있습니까?


22

오늘 코드 검토 중에 내 동료가 흥미로운 것을 말했습니다.

prototype상속이 필요할 때만 유용합니다. 상속이 언제 좋은 아이디어 입니까?

나는 이것에 대해 생각했고 처음에는 잘못 설계 된 코드를 피하기 위해 상속을 사용한다는 것을 깨달았습니다. 현대의 OO 스타일은 상속보다 구성을 선호하지만, 이것을 마음에 새기고 실제로 시행 하는 언어는 모릅니다 .

클래스 기반 상속을 허용하지 않는 클래스, 객체, 메소드, 인터페이스 등을 가진 범용 프로그래밍 언어가 있습니까? (이러한 아이디어가 이해가되지 않는다면 왜 그렇지 않습니까?)


7
동료가 길을 잃었습니다. 는 prototype또한 public 메소드와 인스턴스간에 공유되어야 특성이있을 때 유용합니다. instanceofJavaScript 에서 연산자 를 올바르게 사용할 수 있기 때문에 유용합니다 if (foo instanceof Foo) { ....
Greg Burghardt

2
유형, 상태, 행동의 상속을 구분해야한다고 생각합니다. 구성의 선호는 Java 커뮤니티에서 매우 일반적이지만 동시에 유형의 상속 (및 다중 상속)이 널리 사용되고 권장됩니다 ... implements(상태의 상속과 반대 되는 키워드와 인터페이스를 사용하여 실현됨) extends구현을 포함하는 클래스 에서 키워드를 사용하여 도입 된 동작 ).
toniedzwiedz

6
선호하는 구성이 상속을 완전히 포기한다는 것이 좋은 생각은 아닙니다.
Caleb

5
구현 상속없는 Java 참조 : "Google의 이동은 OOP 인 동안 구현 상속을 제거하는 언어의 예입니다."
gnat

1
@GregBurghardt 함수를 포함하는 객체를 반환하는 팩토리 함수 (클로저에 개인 데이터 저장)를 사용하여 동일한 작업을 수행 할 수 있습니다. new, this그리고 prototype모든 너무 많이 IMO 일반적인 사용에 대한 지뢰밭의입니다.
Benjamin Hodgson

답변:


18

객체 지향 프로그래밍의 정의에 대한 질문을 제쳐두고 그 질문은 "구성 만 사용하고 상속을위한 도구가없는 언어가 있습니까?"중 하나가됩니다.

이에 대한 대답은 "예"입니다. 결국, 고전적으로 생각하는 것처럼 상속을 수행 할 수있는 방법은 없습니다. 하나는 다른 개체에서 개체를 삽입하고 해당 개체를 확장합니다. 에서 객체 Desoriented 언어 ( GitHub의 거울 ) :

type Person struct {
        Name string
}

func (p *Person) Intro() string {
        return p.Name
}

type Woman struct {
        Person
}

func (w *Woman) Intro() string {
        return "Mrs. " + w.Person.Intro()
}

이름이 String 인 person 구조체가 있습니다. 이름을 반환하는 Intro라는 공용 함수가 있습니다. Woman 구조체에는 내장 된 스트럿에 액세스하는 Intro 기능도 있습니다. 따라서 구성 만 사용하여 상속 의도를 충족시킬 수 있습니다.

이에 대한 자세한 내용은 GoLang Tutorials : Go의 상속 및 서브 클래 싱 또는 유사점 에서 확인할 수 있습니다 .

따라서 OO 언어를 상속받지 않고 가질 수 있으며 존재합니다.

Go 내에서 이것은 임베딩 이라고하며 , 포괄 구조에 임베드 된 필드 및 함수에있는 것처럼 액세스 할 수있는 기능을 제공하지만 서브 클래스는 아닙니다. 디자인 철학은 Go FAQ : 유형 상속이없는 이유 에서 찾을 수 있습니다 .


또한 C 의 사용 typedef및 사용에 대해 언급 할 수 있습니다 struct.
cwallenpoole

@cwallenpoole C에는 객체 지향 언어라고 부르는 것이 주저하지만 비슷한 아이디어가 있습니다.

난 몰라 첨부 된 함수로 객체를 만들 수는 없다는 사실을 인정할 것입니다.하지만 상속하지 않으면 OOP가 많은 맛을 잃어 버립니다.
cwallenpoole

@cwallenpoole 그리고 우리는 상속과 객체 방향을 정의하기 시작합니다. 그러나 문제에 대해 생각은 단지 다른 방법으로 가능. 문제는 상속이 대부분의 C ++ 및 Java 프로그래머가 확장을 생각하는 방식이지만 다른 모델도 있다는 것입니다. 상속없는 확장 : 1 , 2 , 3 은 잘 읽습니다.

"Object Desoriented Language"에 대한 링크는 현재 리디렉션 루프에 머물러 있지만 github.com/nu7hatch/areyoufuckingcoding.me/blob/master/content/… 기사를 찾았 습니다 . 감사!
Matt Browne

7

클래스 기반 상속을 허용하지 않는 클래스, 객체, 메소드, 인터페이스 등을 가진 범용 프로그래밍 언어가 있습니까?

이것은 VBA-Visual Basic for Applications, Microsoft Office 및 기타 VBA 가능 호스트 (예 : AutoCAD, Sage 300 ERP 등) 또는 VB6에 대한 설명과 매우 유사합니다. "Basic"의 "A"는 "All-purpose"를 나타내므로 "general-purpose"부분이 있습니다.

VB6 / VBA에는 클래스 (따라서 객체), 메소드 및 인터페이스가 있습니다. 다음 ISomething과 같이 클래스 모듈에서 인터페이스를 정의 할 수 있습니다 .

Option Explicit

Public Sub DoSomething()
End Sub

그리고 이것을하는 또 다른 수업이 있습니다.

Option Explicit
Implements ISomething

Private Sub ISomething_DoSomething()
    'implementation here
End Sub

공개 멤버를 노출시키지 않는 이러한 클래스는 ISomething인터페이스 를 통해서만 액세스 할 수 있으며 수십 가지의 다양한 구현이 가능 ISomething하므로 OOP VBA 코드는 다형성을 완벽하게 수행 할 수 있으며 주어진 클래스에 대해 완벽하게 합법적입니다. 여러 인터페이스를 구현할 수도 있습니다.

VB6 / VBA는 클래스 상속을 허용하지 않으므로 다른 유형에서 구현 을 상속 할 수 없으며 인터페이스 만 상속 할 수 있습니다. 이것이 사고, 설계 결함, 천재의 획 또는 엄청난 추악한 감독인지 여부에 대한 논쟁은 이제 열려 있습니다. VB6 / VBA 가 이것을 마음에 새기는 지 확실하지 않지만 가장 확실하게 시행 합니다.

경우 이동은 클래스 상속을하고 그럼에도 불구하고 OOP 언어입니다하지 않습니다 VB6 / VBA가 OOP 언어로 간주뿐만 아니라 수없는 이유, 그때는 표시되지 않습니다.</PreemptiveResponseToVBAHatersThatWillSayItIsNotAnOOPLanguage>


1
공정하게 말해서 OP는 현대 언어 에 대해 물었습니다 . =) -
RubberDuck

@RubberDuck # 번!
Mathieu Guindon 2016 년

0

개인 / 보호 된 사용 및 "PImpl"또는 "개인 구현"기술의 현대적인 사용을 통해 컴파일러가 선택적 상속을 강제 할 수 있습니다.

많은 API는 사용자가 상속하기를 원하는 구성 요소 만 노출하고 나머지는 별도의 구현 클래스에서 숨 깁니다. 따라서 공용 인터페이스를 상속 할 수없고 객체 구성을 통해서만 사용할 수 있고 컴파일러가 적용되는 클래스를 작성할 수 있습니다. 이것은 컴파일러를 사용하여 소프트웨어의 의도를 시행 할 때 종종 좋은 습관입니다.

자바 스크립트에서 개인 멤버 함수를 빠르게 검색하면 비슷한 원리가 있음을 알 수 있지만 코드를 사용할 수 있으면 누구나 코드를 볼 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.