Programing

상속과 다형성의 주요 차이점은 무엇입니까?

crosscheck 2020. 6. 5. 18:56
반응형

상속과 다형성의 주요 차이점은 무엇입니까?


나는 오늘 모듈 오픈 북 시험의 끝 에서이 질문을 받았으며 자신을 잃어 버렸습니다. 나는 읽고 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라는 새 클래스를 작성하기 만하면됩니다. 다형성으로 인해 다른 모든 클래스는 변경없이 계속 작동 할 수 있습니다! 센스?

So, it means using Inheritance which is one of the way to achieve polymorphism.

Polymorhism can be possible in a class / interface but Inheritance always between 2 OR more classes / interfaces. Inheritance always conform "is-a" relationship whereas it is not always with Polymorphism (which can conform both "is-a" / "has-a" relationship.


Inheritance is more a static thing (one class extends another) while polymorphism is a dynamic/ runtime thing (an object behaves according to its dynamic/ runtime type not to its static/ declaration type).

E.g.

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

-> Though the static/ declaration type of a is A, the actual dynamic/ runtime type is B and thus a.foo() will execute foo as defined in B not in A.


Polymorphism is an approach to expressing common behavior between types of objects that have similar traits. It also allows for variations of those traits to be created through overriding. Inheritance is a way to achieve polymorphism through an object hierarchy where objects express relationships and abstract behaviors. It isn't the only way to achieve polymorphism though. Prototype is another way to express polymorphism that is different from inheritance. JavaScript is an example of a language that uses prototype. I'd imagine there are other ways too.


Inheritance is a concept related to code reuse. For example if I have a parent class say Animal and it contains certain attributes and methods (for this example say makeNoise() and sleep()) and I create two child classes called Dog and Cat. Since both dogs and cats go to sleep in the same fashion( I would assume) there is no need to add more functionality to the sleep() method in the Dog and Cat subclasses provided by the parent class Animal. However, a Dog barks and a Cat meows so although the Animal class might have a method for making a noise, a dog and a cat make different noises relative to each other and other animals. Thus, there is a need to redefine that behavior for their specific types. Thus the definition of polymorphism. Hope this helps.


Oracle documentation quoted the difference precisely.

inheritance: A class inherits fields and methods from all its superclasses, whether direct or indirect. A subclass can override methods that it inherits, or it can hide fields or methods that it inherits. (Note that hiding fields is generally bad programming practice.)

polymorphism: polymorphism refers to a principle in biology in which an organism or species can have many different forms or stages. This principle can also be applied to object-oriented programming and languages like the Java language. Subclasses of a class can define their own unique behaviors and yet share some of the same functionality of the parent class.

polymorphism is not applicable for fields.

Related post:

Polymorphism vs Overriding vs Overloading


Polymorphism is an effect of inheritance. It can only happen in classes that extend one another. It allows you to call methods of a class without knowing the exact type of the class. Also, polymorphism does happen at run time.

For example, Java polymorphism example:

enter image description here

Inheritance lets derived classes share interfaces and code of their base classes. It happens at compile time.

For example, All Classes in the Java Platform are Descendants of Object (image courtesy Oracle):

enter image description here

To learn more about Java inheritance and Java polymorphism


Inheritance is when class A inherits all nonstatic protected/public methods/fields from all its parents till Object.


If you use JAVA it's as simple as this:

Polymorphism is using inherited methods but "Overriding" them to do something different (or the same if you call super so wouldn't technically be polymorphic).

Correct me if I'm wrong.


The main purpose of polymorphism : To create reference variable to super class and holding the subclass object => an object can perform multiple behaviours.

In inheritance, subclass inherit the properties of super class.


inheritance is kind of polymorphism, Exactly in fact inheritance is the dynamic polymorphism. So, when you remove inheritance you can not override anymore.


Polymorphism is achieved by Inheritance in Java.

public class Animal {}
public interface Herbivore {}
public interface Carnivore {}
public interface Pet {}

public class Hamster extends Animal implements Herbivore implements Pet () {}
public class Cat extends Animal implements Carnivore implements Pet () {}

Hamster class inherits structure from Animal, Herbivore and Pet to exhibit Polymorphic behaviorism of a domestic pet.

Cat class inherits structure from Animal, Carnivore and Pet to also exhibit Polymorphic behaviorism of a domestic pet.


With Inheritance the implementation is defined in the superclass -- so the behavior is inherited.

class Animal
{
  double location;
  void move(double newLocation)
  {
    location = newLocation;
  }
}

class Dog extends Animal;

With Polymorphism the implementation is defined in the subclass -- so only the interface is inherited.

interface Animal
{
  void move(double newLocation);
}

class Dog implements Animal
{
  double location;
  void move(double newLocation)
  {
    location = newLocation;
  }
}

참고URL : https://stackoverflow.com/questions/6308178/what-is-the-main-difference-between-inheritance-and-polymorphism

반응형