상속과 다형성의 주요 차이점은 무엇입니까? 북 시험의 끝 에서이

나는 오늘 모듈 오픈 북 시험의 끝 에서이 질문을 받았으며 자신을 잃어 버렸습니다. 나는 읽고 Head first Java있었고 두 정의는 정확히 같은 것처럼 보였다. 나는 내 자신의 마음에 대한 주요 차이점이 무엇인지 궁금해하고있었습니다. 나는 이것과 비슷한 질문이 많이 있다는 것을 알고 있지만 결정적인 대답을 제공하는 것은 없습니다.



답변

상속은 ‘클래스’가 기존 ‘클래스’에서 파생 될 때입니다. 당신은이 그렇다면 Person클래스를, 당신은이 Student확장 클래스는 Person, Student 상속 모든 것을 Person가지고있다. 직접 필드 / 메소드에 입력 한 액세스 수정 자에 대한 세부 사항이 있지만 이것이 기본 아이디어입니다. 예를 들어, 당신이 개인 필드가있는 경우 Person, Student그 개인 있기 때문에 그것을 볼, 민간 분야는 서브 클래스에 표시되지 않습니다.

다형성은 어떤 유형의 물건에 따라 프로그램이 어떤 방법을 사용해야하는지 결정합니다. 당신이있는 경우 Person이있는, read방법을, 당신은이 Student확장되는 Person고유의 구현이있는, read당신이있는 경우에 따라 런타임에 의해 당신을 위해 결정 호출되는 방법, Person또는를 Student. 조금 까다로워 지지만 다음과 같은 일을하면

Person p = new Student();
p.read();

Student 의 read 메소드 가 호출됩니다. 그것이 다형성의 실천입니다. a Student 는 a 이므로 해당 할당을 수행 할 수 Person있지만 런타임은 실제 유형 pStudent 인 것을 알기에 충분히 영리 합니다.

세부 사항은 언어마다 다릅니다. 예를 들어 자바 스크립트에서 상속을 수행 할 수 있지만 Java에서 작동하는 방식과 완전히 다릅니다.


답변

상속 은 서브 클래스에서 수퍼 클래스 의 구조와 동작사용하는 것을 말합니다 .

다형성 은 서브 클래스에서 수퍼 클래스 의 동작변경하는 것을 말합니다 .


답변

다형성 (Polymorphism) : 다른 유형의 물체를 비슷한 방식으로 처리하는 능력. 예 : 기린과 악어는 모두 동물이며 동물은 할 수 있습니다 Move. 의 인스턴스가 있다면 어떤 종류의 동물인지 알거나 돌보지 않고 Animal전화 할 수 있습니다 Move.

상속 : 이것은 다형성과 코드 재사용을 동시에 달성하는 한 가지 방법입니다.

다형성의 다른 형태 : 다형성을 달성하는 다른 방법이 있습니다, 같은 단지 다형성하지만 코드 재사용을 제공하는 인터페이스로는 (때로는 코드는 다음과 같은 매우 다른 Move뱀은 상당히 다른 것위한 Move, 개가있는 경우 이 경우 인터페이스가 더 나은 다형성 선택이 될 것입니다.

다른 동적 인 언어에서, 다형은 Duck Typing으로 달성 할 수 있습니다.이 클래스는 동일한 기본 클래스 또는 인터페이스를 공유 할 필요가 없으며 동일한 이름의 메소드 만 있으면됩니다. 또는 Javascript와 같이 훨씬 역동적이므로 클래스가 전혀 필요하지 않으며 동일한 메소드 이름을 가진 객체 만 다형성으로 사용할 수 있습니다.


답변

주요 차이점은 다형성이 상속의 특정 결과라는 것입니다. 다형성은 호출 할 메소드가 런타임에 오브젝트 유형에 따라 결정되는 위치입니다. 이것은 한 클래스가 다른 클래스를 상속하고 특정 메소드를 대체 할 때 발생하는 상황입니다. 그러나 일반 상속 트리에서는 메서드를 재정의 할 필요가 없으므로 모든 메서드 호출이 다형성 일 필요는 없습니다. 말이 돼? 그것은 모든 포드 차량과 자동차와 비슷한 문제이지만 모든 자동차가 포드는 아닙니다 (그러나 ….)는 아닙니다.

또한 다형성은 메소드 호출을 처리하지만 상속은 데이터 멤버 등을 설명합니다.


답변

Java에서 두 가지는 밀접한 관련이 있습니다. Java가 “동적 디스패치”라는 메소드 호출 기술을 사용하기 때문입니다. 만약 내가 가지고 있다면

public class A {
  public void draw() { ... }
  public void spin() { ... }
}

public class B extends A {
  public void draw() { ... }
  public void bad() { ... }
}

...

A testObject = new B();

testObject.draw(); // calls B's draw, polymorphic
testObject.spin(); // calls A's spin, inherited by B
testObject.bad(); // compiler error, you are manipulating this as an A

그러면 B가 상속하는 것을 볼 수 있습니다 spin 가 A로부터 있습니다. 그러나 객체를 마치 A 형인 것처럼 조작하려고하면 여전히 B의 동작이 나타납니다 draw. draw동작은 다형성이다.

일부 언어에서 다형성과 상속은 밀접한 관련이 없습니다. 예를 들어 C ++에서 virtual로 선언되지 않은 함수는 상속되지만 동적으로 전달되지 않으므로 상속을 사용할 때도 다형성 동작을 얻지 못합니다.

자바 스크립트에서 모든 함수 호출은 동적으로 전달되며 약한 입력이 있습니다. 즉, 각각 고유 한 draw, 관련 객체를 반복하고 함수를 호출하는 함수를 가질 수 있으며 각각 정상적으로 작동합니다. 상속을받지 않고도 자신 만의 다형성 추첨을 할 수 있습니다.


답변

다형성 : 펜을 판매하는 회사에서 일한다고 가정 해보십시오. 따라서 펜에 대해 알아야 할 모든 것을 처리하는 “펜”이라는 멋진 클래스를 만듭니다. 청구, 운송, 송장 작성을위한 모든 종류의 클래스를 Pen 클래스를 사용하여 작성합니다. 하루의 상사가 와서 “훌륭한 뉴스! 회사가 성장하고 있고 우리는 지금 Books & CD를 판매하고 있습니다!” Book & CD를 사용하기 위해 Pen을 사용하는 모든 클래스를 변경해야하기 때문에 좋은 소식은 아닙니다. 그러나 원래 “SellableProduct”라는 인터페이스를 만든 경우 Pen은이 인터페이스를 구현했습니다. 그런 다음 펜 대신 해당 인터페이스를 사용하기 위해 모든 배송, 송장 등의 클래스를 작성할 수 있습니다. 이제 SellableProduct 인터페이스를 구현하는 Book & CompactDisc라는 새 클래스를 작성하기 만하면됩니다. 다형성으로 인해 다른 모든 클래스는 변경없이 계속 작동 할 수 있습니다! 감지?

다형성을 달성하는 방법 중 하나 인 상속을 사용한다는 의미입니다.

다형성은 클래스 / 인터페이스에서 가능하지만 상속은 항상 2 개 이상의 클래스 / 인터페이스 사이에서 가능합니다. 상속은 항상 “is-a”관계를 따르는 반면, 항상 다형성 ( “is-a”/ “has-a”관계를 모두 준수 할 수있는)과 다를 수 있습니다.


답변

상속은 더 정적 인 것입니다 (한 클래스는 다른 클래스를 확장합니다) 반면 다형성은 동적 / 런타임 것입니다 (객체는 정적 / 선언 유형이 아닌 동적 / 런타임 유형에 따라 동작합니다).

예 :

// This assignment is possible because B extends A
A a = new B();
// polymorphic call/ access
a.foo();

-> a의 정적 / 선언 유형은 A이지만 실제 동적 / 런타임 유형은 B이므로 a.foo ()는 A가 아닌 B에 정의 된대로 foo를 실행합니다.