오리가 다형성의 하위 집합을 입력하고 있습니까


17

위키피디아의 다형성에서

컴퓨터 과학에서 다형성 (polymorphism)은 균일 한 인터페이스를 사용하여 다양한 데이터 유형의 값을 처리 할 수있는 프로그래밍 언어 기능입니다.

Wikipedia의 오리 입력에서

객체 지향 프로그래밍 언어를 사용한 컴퓨터 프로그래밍에서 덕 타이핑은 객체의 현재 메소드 및 속성 세트가 특정 클래스 또는 특정 인터페이스의 구현에서 상속되지 않고 유효한 의미를 결정하는 동적 타이핑 스타일입니다.

내 해석은 오리 타이핑을 기반으로 객체 메소드 / 속성이 유효한 의미를 결정한다는 것입니다. 객체의 현재 모양이 유지하는 인터페이스를 결정한다는 의미입니다.

다형성에서 함수가 인터페이스를 유지하는 한 여러 다른 데이터 유형을 허용하는 경우 함수가 다형성이라고 말할 수 있습니다.

따라서 함수가 유형을 더킹 할 수있는 경우, 해당 데이터 유형에 올바른 메소드 / 속성이 있고 인터페이스를 유지하는 한 여러 다른 데이터 유형을 허용하고 작동 할 수 있습니다.

(인터페이스 용어의 사용은 코드 구성이 아니라 설명적이고 문서화 된 구성으로 사용됩니다)

  • 덕 타이핑과 다형성 사이의 올바른 관계는 무엇입니까?
  • 언어가 덕 형일 수 있다면 다형성이 가능하다는 의미입니까?

1
답에서 찾고있는 것이 확실하지 않습니다. 두 가지를 모두 정확하게 정의 했으므로 정답이 많이 있습니다. 오리 타이핑이 다형성으로 "계산"되는지 결정하는 것은 다소 철학적 인 질문이거나, 그런 식으로 의미한다면 용어 질문 일 수도 있습니다. 그래서 당신은 대답에서 무엇을 찾고 있습니까?
psr

@psr 나는 기본적으로 "어떻게 해석해야합니까? 틀렸나 요? 맞습니까? 다른 방법으로 말하는 재교육 가능한 학자들이 있습니까? 주제에 관한 기사가 있습니까?" 기본적으로 다른 것보다 "오리 프 타이핑은 다형성의 구현 / 하위 집합입니다"라는 관계에 대해 더 말할 수있는 것은 무엇입니까?
Raynos

내가 이해하는 한, 호모 그래피 는 오리가 다른 것을 타이핑하지만 다형성이 아닌 균일 한 인터페이스 => 적어도 Wikipedia가 그것을 정의하는 방식을 의미하지는 않습니다. 예 door.close()tiger.close()
모기

4
오리 타이핑은 임시 다형성 의 경우입니다 . 당신은 이것을 너무 많이 생각하고 있습니다.
yannis

답변:


16

나는 다형성이 일반적인 특성이며 여러 가지 방법으로 구현할 수 있다고 말합니다.

  • 클래스 기반 상속.
  • 프로토 타입 기반 객체 (상속 유무)
  • 오리 타이핑
  • 인터페이스 준수 (Go의 인터페이스에 의해 수행되고 C ++ 템플릿에서 암시 적으로)

이들 각각은 프로그래머가 다른 유형의 단일 코드를 사용할 수 있도록하여 다형성의 개념을 구현합니다.


7

내 생각에는:

오리 타이핑과 다형성 모두 간접 / 추억의 수단입니다. 다형성은 유형과 타이핑에 기초한 개념이며 오리 타이핑은 계약에 기초합니다.

다형성의 경우 THING이 무엇인지, 그것이 어떻게 행동하는지가 중요하지 않습니다 (동작은 그 결과 일 수 있습니다).

오리 타이핑에서는 THING이 어떻게 동작하는지가 중요합니다. 덕 타이핑은 정의 된 속성이있는 객체가 아니라 메시지를 교환하는 행위자 인 객체의 개념과 더 밀접한 관련이 있습니다.


2
이것은 잘못이다. 다형성은 많은 것을 덮는 거대한 우산입니다. 특히 오리 타이핑을 다룹니다. 따라서 오리 타이핑은 다형성의 한 형태입니다.
Thomas Eding

동의하지 않습니다. 행동 방식을 가진 전통적인 상속은 동일한 특성을 가지고 있습니다. 이 객체가 어떤 행동으로 명시되는 것만으로 더 타입 안전 보장 전시회에 (다른 행동을 배제하지 않는다!)
marstato

6

대답은 입니다.

오리 타이핑은 동적 타이핑 의 특별한 경우이며 , 동적 타이핑 자체 가 다형성으로 직접 고려 될 수없는 경우에도 (일반적으로 컴파일 타임이 아닌 런타임시 유형 검사를 수행하는 언어의 속성이기 때문에) 일반적으로 동적 타이핑의 기초가되는 경우, 이러한 후기 바인딩동적 디스패치다형성의 특징입니다 .


Wikipedia 기사의 문제와 요즘 용어를 사용하는 사람들의 수는 오리 타이핑을 처음 보았을 때의 의미 (즉, 타이핑 형식)를 정의하지 않고 메서드를 호출하고 정의되지 않은 런타임 오류. Eric Lippert가 설명 하듯 이 이는 타이핑이 아니라 타이핑 부족입니다 .
reinierpost 2016 년

1

덕 타이핑은 다형성의 일부가 아닙니다. 다형성에는 명시 성이 필요하기 때문에 덕 타이핑에서는 없어집니다. 따라서 오리 타이핑은 의미 상 의미가 아니라 서명이 동일하기 때문에 "인터페이스"를 "구현"할 수 있습니다. 오리 타이핑이 다형성의 하위 집합 인 경우 명시 적 선언을 포함하여 다형성의 모든 속성을 갖습니다.

오리 타이핑은 실제로 다형성의 구현이 아니며 다른 유형 시스템의 일부입니다. 일반적으로 오리 타이핑을 동적 언어와 연결하여 객체를 처리 할 수 ​​있는지 여부를 알지 못하고 메시지를 객체에 전달하는 동적 언어와 연결합니다. 가능하면 오리 타이핑 테스트를 효과적으로 통과 한 것입니다. 일반적으로 vtables (그리고 인터페이스가 클래스와 다른 경우 가능)를 설정하여 다형성이 컴파일 타임에 구현되는 것으로 생각합니다. 그러나 많은 언어가 있으며 이러한 기능을 구현하는 많은 방법이 있습니다.

어느 정도 이것은 철학적 인 질문입니다. 오리 타이핑을 자동으로 암시 적으로 선언되는 인터페이스라고 생각할 수 있습니까? 나는 그것이 틀린 이유를 정확히 생각할 수는 없지만, 그것이 그것을 보는 가장 생산적인 방법이라고 생각하지 않습니다. 오리 타이핑과 인터페이스는 프로그래밍 언어의 유형 시스템에서 흔히 볼 수있는 기능이며, 비슷한 동작 방식을 가지고 있으며 프로그래머가 이해하는 데 중요합니다.


6
"다형성에는 명시 성이 필요하다"는 말은 어디에 있습니까? 클래스 기반 상속은 유일한 형태가 아닌 다형성의 형태 일뿐입니다.
Javier

그리고 @Javier의 의견을 계속하면 애드혹 다형성은 어떻습니까?
yannis

@YannisRizos-이와 같은 질문에 대답하는 문제는 당신이 무슨 말을하든 누군가가 당신을 nitpick 할 수있는 너무 많은 언어와 너무 많은 용어가 있다는 것입니다. 나는 왜 "ad hoc polymorphism"이라는 이름에 "polymorphism"이라는 단어가 있지만 OP가 "polymorphism"이 의미하는 것 이외의 다른 주장이라고 생각합니다.
psr

@Javier-나열된 모든 방법에는 오리 입력을 제외하고 명시 성이 필요합니다.
psr

@psr 실제로 OP는 "다형성"이 무엇을 의미하는지에 대해서는 신경 쓰지 않습니다. 나는 누구도 신경 써서는 안된다고 생각합니다. 그것은 매우 간단한 정의를 가진 과학적 개념입니다. 우리는 우리 자신의 해석이나 OPs 해석이라고 생각할 수있는 것에 근거하여 대답해야한다고 생각하지 않습니다. 특히 OP의 해석은 그가 기본적으로 요구하기 때문에 그의 해석에 대해 확신 할 수 없다. 나는 그것이 철학적 질문이라는 것에 동의하지 않는다. 언급 된 질문은 하나의 간단한 답을 가진 과학적인 질문이었다. 그렇다. 덕 타이핑은 다형성의 한 부분 집합 인 임시 다형성의 한 형태이다.
yannis

1

"예, foo에 오리 타이핑이 있으면 foo에 다형성이 있습니다"라고 말하는 것이 자연 스럽습니다. 그러나 나는 100 % 확실하다고 말할 수는 없습니다. 어쩌면 오리 타이핑이있는 그러한 시스템의 인공적인 예를 생각해 내는 것이 가능할 수도 있습니다 ( "물을 & 수 있으며 & = 물에 떠 다닐 수 있습니까 ==> 오리 ")는 다형성 ("foo, quack! "이 실패 함)을 갖지 않지만 실제로 인공적이고 실제 세계에있을 것입니다."그렇습니다. 오리 타이핑이 있으면 다형성도 존재해야합니다. "

개인적으로 오리 타이핑은 "다형성이 올바르게 이루어졌다"고 생각합니다. 내 말은, 오리 타이핑 세계에 존재하는 것은 명시 적 유형을 가질 필요가 없으며 (다형성 = "동일한 액세스, 다른 결과") 행동 만이 중요합니다. 다형성의 다른 구현에서, 그것은 유형 / 인터페이스 / 상속으로 제한되므로, "다형성 자체"가 아니라 "구현되고 제한되는 다형성"이다.


0

정적으로 유형이 지정된 프로그래밍 언어를 사용하면 런타임시 모든 유형 일관성 검사가 수행되는 언어보다 더 빠른 오류 검사, 규율이 좋은 프로그래밍 스타일을 효과적으로 적용하고보다 효율적인 개체 코드를 생성 할 수 있습니다.

(B. 피어스와 친구들)

이와 관련하여 오리 타이핑은 동적 타이핑이며 실제로는 그렇지 않습니다.

다형성과 관련된 유형을 결정하는 몇 가지 방법이 있습니다. 예를 들어 코드를 더 유연하게 만들지 만 오리 타이핑은 이러한 경우에 또 다른 문제입니다.

자세하게는 계산 된 속성과 계산을 결정하는 데 도움이되는 형식화 된 람다 미적분 및 형식이없는 람다 미적분이 있습니다.

또한 결과를 빠르게 얻으려는 경우 오리 타이핑과 같은 것이 도움이 될 수 있지만 다른 경우에는 동적 특성으로 인해 필요에 맞게 조정할 수 있으므로 더 빨리 계산할 수 있다고 생각합니다. 나는 그것이 이미 계산하고 싶은 것을 정말로 알고 있다면, 타이핑이 가장 좋지만, 왜 내가 원하는 것을 아는가? 헤 헤헤 ...

그것은 나의 5 센트이고 나는 그것이 흥미로운 연구 주제를 만들 수 있다고 생각합니다.

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