문제

다형성이란 무엇이고, 무엇을 위한 것이며, 어떻게 사용되나요?

도움이 되었습니까?

해결책

이 용어의 그리스 뿌리에 대해 생각한다면 분명해야합니다.

  • poly = mangy : 다각형 =다면, 폴리스티렌 = 많은 스티렌스 (ㅏ), polyglot = 많은 언어 등.
  • Morph = 변화 또는 형태 : 형태학 = 생물학적 형태의 연구, Morpheus = 그리스어 꿈의 신.

따라서 다형성은 (프로그래밍에서) 다른 기본 형태 (데이터 유형)에 대해 동일한 인터페이스를 제시하는 능력입니다.

예를 들어, 많은 언어에서, 정수와 부유물은 유형이 다르다는 사실에 관계없이 추가, 빼기, 곱하기 등을 추가 할 수 있기 때문에 암시 적으로 다형성입니다. 그들은 평범한 용어에서 거의 객체로 간주되지 않습니다.

그러나 같은 방식으로 수업은 BigDecimal 또는 Rational 또는 Imaginary 다른 데이터 유형에서 작동하더라도 해당 작업을 제공 할 수 있습니다.

전형적인 예는 Shape 클래스와 그로부터 상속받을 수있는 모든 클래스 (정사각형, 원, dodecahedron, 불규칙 다각형, splat 등).

다형성을 사용하면 이러한 각 클래스는 다른 기본 데이터를 갖습니다. 포인트 모양은 두 개의 코디네이트 만 필요합니다 (물론 2 차원 공간에 있다고 가정). 원에는 중심과 반경이 필요합니다. 정사각형 또는 사각형은 상단 왼쪽 및 하단 오른쪽 모서리와 회전을 위해 두 개의 코디네이션이 필요합니다. 불규칙한 다각형에는 일련의 선이 필요합니다.

클래스가 코드와 데이터를 책임지게함으로써 다형성을 달성 할 수 있습니다. 이 예에서 모든 수업에는 자체 수업에 Draw() 기능과 클라이언트 코드는 단순히 다음을 수행 할 수 있습니다.

shape.Draw()

모든 모양에 대한 올바른 동작을 얻습니다.

이것은 코드가 데이터와 분리 된 작업을 수행하는 오래된 방식과 대조적이며 다음과 같은 기능이 있었을 것입니다. drawSquare() 그리고 drawCircle().

객체 방향, 다형성 및 상속은 모두 밀접하게 관련된 개념이며 알아야합니다. 오랜 경력 동안 많은 "은 총알"이 있었는데 기본적으로 기본적으로 어리석은 곳이지만 OO 패러다임은 좋은 것으로 판명되었습니다. 그것을 배우고 이해하고 사랑합니다 - 당신은 당신이 기뻐할 것입니다 :-)


(ㅏ) 나는 원래 그것을 농담으로 썼지 만 그것은 정확한 것으로 판명되었으므로 그다지 재미 있지는 않습니다. 모모머 스티렌은 탄소와 수소로 만들어졌습니다. C8H8, 폴리스티렌은 그 그룹으로 만들어졌습니다. (C8H8)N.

아마도 나는 폴립이 편지의 많은 사건이라고 말했을 것입니다. p 그러나 지금은 농담을 설명해야했지만 그조차도 재미 있지 않습니다.

때때로, 당신은 뒤에있는 동안 그냥 종료해야합니다 :-)

다른 팁

다형성은 객체를 어떤 것의 일반 버전으로 취급할 수 있지만 객체에 액세스하면 코드가 객체의 정확한 유형을 결정하고 관련 코드를 호출하는 경우입니다.

다음은 C#의 예입니다.콘솔 애플리케이션 내에서 4개의 클래스를 만듭니다.

public abstract class Vehicle
{
    public abstract int Wheels;
}

public class Bicycle : Vehicle
{
    public override int Wheels()
    {
        return 2;
    }
}

public class Car : Vehicle
{
    public override int Wheels()
    {
        return 4;
    }
}

public class Truck : Vehicle
{
    public override int Wheels()
    {
        return 18;
    }
}

이제 콘솔 애플리케이션용 모듈의 Main()에서 다음을 생성합니다.

public void Main()
{
    List<Vehicle> vehicles = new List<Vehicle>();

    vehicles.Add(new Bicycle());
    vehicles.Add(new Car());
    vehicles.Add(new Truck());

    foreach (Vehicle v in vehicles)
    {
        Console.WriteLine(
            string.Format("A {0} has {1} wheels.",
                v.GetType().Name, v.Wheels));
    }
}

이 예에서는 각 하위 클래스에 바퀴가 몇 개 있는지는 모르지만 각 하위 클래스에 바퀴가 몇 개 있는지 아는 역할을 하는 기본 클래스 Vehicle의 목록을 만듭니다.

그런 다음 자전거, 자동차 및 트럭을 목록에 추가합니다.

다음으로 목록의 각 Vehicle을 반복하여 모두 동일하게 처리할 수 있지만 각 Vehicle의 'Wheels' 속성에 액세스하면 Vehicle 클래스가 해당 코드 실행을 관련 하위 클래스에 위임합니다.

실행되는 정확한 코드는 런타임에 참조되는 하위 클래스에 의해 결정되므로 이 코드는 다형성이라고 합니다.

이것이 당신에게 도움이 되기를 바랍니다.

에서 PHP에서 다형성 이해 및 적용, 감사합니다 Steve Guidetti.

다형성은 매우 간단한 개념의 긴 단어입니다.

다형성은 공통 인터페이스를 공유하면서 클래스가 다른 기능을 갖는 객체 지향 프로그래밍의 패턴을 설명합니다.

다형성의 아름다움은 다른 클래스에서 작업하는 코드가 모두 같은 방식으로 사용되기 때문에 어떤 클래스를 사용하고 있는지 알 필요가 없다는 것입니다. 다형성에 대한 실제 세계 비유는 버튼입니다. 누구나 버튼을 사용하는 방법을 알고 있습니다. 단순히 압력을 가해집니다. 그러나 버튼이 "하는 일"은 연결된 내용과 사용이 사용되는 컨텍스트에 따라 다르지만 결과는 사용 방법에 영향을 미치지 않습니다. 상사가 버튼을 누르라고 지시하면 이미 작업을 수행하는 데 필요한 모든 정보가 있습니다.

프로그래밍 세계에서 다형성은 응용 프로그램을보다 모듈 식적이고 확장하기 위해 사용됩니다. 다양한 행동 과정을 설명하는 지저분한 조건부 진술 대신 필요에 따라 선택할 수있는 상호 교환 가능한 객체를 만듭니다. 그것이 다형성의 기본 목표입니다.

누구 든지이 사람들에게 끊어진다면

  1. 외과 의사
  2. 헤어 스타일리스트
  3. 배우

무슨 일이 일어날 것?

  • 외과 의사는 절개를 시작할 것입니다.
  • 헤어 스타일리스트는 누군가의 머리카락을 자르기 시작했습니다.
  • 배우는 현재 장면에서 갑자기 행동을 중단하면서 감독지도를 기다리고 있습니다.

따라서 위의 표현은 OOP에서 다형성 (동일한 이름, 다른 행동)이 무엇인지 보여줍니다.

인터뷰를하러 가고 면접관이 당신에게 우리가 앉아있는 같은 방에서 다형성에 대한 살아있는 예를 들려 주거나 보여줍니다.

답 - 도어 / 창

어떻게 궁금하십니까?

문 / 창문을 통해 - 사람이 올 수 있고, 공기가 올 수 있고, 빛이 올 수 있고, 비가 올 수 있습니다.

더 잘 이해하고 간단한 방식으로 위의 예제를 사용했습니다. 코드에 대한 참조가 필요한 경우 위의 답변을 따르십시오.

유추에 의한 간단한 설명

미국 대통령은 다형성을 사용합니다. 어떻게? 글쎄, 그는 많은 고문이 있습니다.

  1. 군사 고문
  2. 법률 고문
  3. 핵 물리학 자 (고문)
  4. 의료 고문

모든 사람은 한 가지만 책임을 져야합니다. 예 :

대통령은 아연 코팅 또는 양자 물리학 전문가가 아닙니다. 그는 많은 것을 알지 못하지만 한 가지만 알고 있습니다 : 나라를 운영하는 방법.

코드와 동일합니다. 우려와 책임은 관련 클래스/사람과 분리되어야합니다. 그렇지 않으면 당신은 대통령이 문자 그대로 세상의 모든 것을 아는 것, 즉 Wikipedia 전체를 알고있을 것입니다. 코드 클래스에 전체 위키 백과가 있다고 상상해보십시오. 유지하는 것은 악몽 일 것입니다.

왜 대통령 이이 구체적인 것들을 아는 것이 나쁜 생각입니까?

대통령이 구체적으로 사람들에게 무엇을 해야하는지 말해야한다면, 대통령은 알다 정확히 무엇을 해야하는지. 대통령이 특정한 것들을 스스로 알아야한다면, 그것은 당신이 변화를해야 할 때, 당신은 하나뿐만 아니라 두 곳에서 그것을 만들어야한다는 것을 의미합니다.

예를 들어, EPA가 오염 법칙을 변경하면 이런 일이 발생하면 EPA 클래스를 변경해야합니다. 그리고 또한 대통령 계급. 하나가 아닌 두 곳에서 코드를 변경하는 것은 위험 할 수 있습니다. 유지하기가 훨씬 어렵 기 때문입니다.

더 나은 접근 방식이 있습니까?

더 나은 접근 방식이 있습니다. 대통령은 어떤 것도 알 필요가 없습니다. 그는 특별히 그 일을하는 사람들로부터 최선의 조언을 요구할 수 있습니다.

그는 다형성 접근법을 사용하여 나라를 운영 할 수 있습니다.

예 - 다형성 접근법 사용의 예 :

대통령은 모든 대통령이 사람들에게 그에게 조언 해달라고 요청하는 것입니다. 그리고 그것이 실제로 그가 실제 생활에서하는 일입니다. 이것이 바로 훌륭한 대통령이해야 할 일입니다. 그의 고문은 모두 다르게 반응하지만, 대통령이 다음과 같이 의미하는 바를 모두 알고있다 : Advise (). 그는 수백 명의 사람들이 그의 사무실로 스트리밍하고 있습니다. 실제로 그들이 누구인지는 중요하지 않습니다. 대통령은 아는 모든 것이 "조언"을 요청할 때 그에 따라 응답하는 방법을 알고 있다는 것입니다.:

public class MisterPresident
{
    public void RunTheCountry()
    {
        // assume the Petraeus and Condi classes etc are instantiated.
        petraeus.Advise(); // # Petraeus says send 100,000 troops to Fallujah
        condolezza.Advise(); // # she says negotiate trade deal with Iran
        healthOfficials.Advise(); // # they say we need to spend $50 billion on ObamaCare
    }
}

이 접근법을 통해 대통령은 군사 물건, 건강 관리 또는 국제 외교에 대해 알지 못하고 문자 그대로 나라를 운영 할 수 있습니다. 세부 사항은 전문가에게 맡겨집니다. 대통령이 알아야 할 유일한 것은 이것입니다 : "Advise ()".

당신이하지 않는 것 "T를 원합니다 :

public class MisterPresident
{
    public void RunTheCountry()
    {
        // people walk into the Presidents office and he tells them what to do
        // depending on who they are.

        // Fallujah Advice - Mr Prez tells his military exactly what to do.
        petraeus.IncreaseTroopNumbers();
        petraeus.ImproveSecurity();
        petraeus.PayContractors();

        // Condi diplomacy advice - Prez tells Condi how to negotiate

        condi.StallNegotiations();
        condi.LowBallFigure();
        condi.FireDemocraticallyElectedIraqiLeaderBecauseIDontLikeHim();

        // Health care

        healthOfficial.IncreasePremiums();
        healthOfficial.AddPreexistingConditions();
    }
}

아니! 아니! 아니! 위의 시나리오에서 대통령은 모든 작업을 수행하고 있습니다. 그는 부대 수와 기존 조건의 증가에 대해 알고 있습니다. 이것은 중동 정책이 바뀌면 대통령이 그의 명령을 바꿔야한다는 것을 의미합니다. 만큼 잘 페트라우스 수업도 마찬가지입니다. 대통령이 그런 세부 사항으로 쇠약해질 필요가 없기 때문에 페트라우스 계급 만 바꿔야합니다. 그는 세부 사항에 대해 알 필요가 없습니다. 그가 알아야 할 것은 하나의 명령을 내리면 모든 것이 돌볼 것입니다. 모든 세부 사항은 전문가에게 맡겨야합니다.

이를 통해 대통령은 자신이 최선을 다하는 일을 할 수 있습니다. 일반 정책을 설정하고, 좋아 보이고, 골프를 치십시오 : p.

실제로 구현되는 방법 - 기본 클래스 또는 공통 인터페이스를 통해

사실상 그다지 간단히 말해서 다형성입니다. 정확히 어떻게 이루어 졌습니까? "공통 인터페이스 구현"을 통해 또는 기본 클래스 (상속)를 사용함으로써 - 이에보다 명확하게 상세한 위의 답변을 참조하십시오. (이 개념을보다 명확하게 이해하려면 인터페이스가 무엇인지 알아야하며 상속이 무엇인지 이해해야합니다. 그 없이는 어려움을 겪을 수 있습니다.)

다시 말해, Petraeus, Condi 및 Healthofficials는 모두 "인터페이스를 구현하는"클래스가 될 것입니다. IAdvisor 하나의 방법을 포함하는 인터페이스 : Advise(). 그러나 지금 우리는 구체적인 내용을 얻고 있습니다.

이것은 이상적입니다

    public class MisterPresident
    {
            // You can pass in any advisor: Condi, HealthOfficials,
            //  Petraeus etc. The president has no idea who it will 
            // be. But he does know that he can ask them to "advise" 
            // and that's all Mr Prez cares for.

        public void RunTheCountry(IAdvisor governmentOfficer)
        {             
            governmentOfficer.Advise();              
        }
    }


    public class USA
    {
        MisterPresident president;

        public USA(MisterPresident president)
        {
            this.president = president;
        }

        public void ImplementPolicy()
        {
            IAdvisor governmentOfficer = getAdvisor(); // Returns an advisor: could be condi, or petraus etc.
            president.RunTheCountry(governmentOfficer);
        }
    }

요약

당신이 정말로 알아야 할 것은 다음과 같습니다.

  • 대통령은 세부 사항을 알 필요가 없습니다. 다른 사람들에게 맡겨집니다.
  • 대통령이 알아야 할 모든 사람은 누가 문을 걷는 사람을 물어 보는 것입니다.

정말 도움이되기를 바랍니다. 당신이 아무것도 이해하지 못하면 의견을 게시하면 다시 시도하겠습니다.

다형성은 마치 부모 클래스 인 것처럼 대상 클래스를 치료하는 능력입니다.

예를 들어, Animal이라는 수업과 Animal에서 물려받는 개라는 계급이 있다고 가정하십시오. 다형성은 개 대상을 동물 대상으로 취급하는 능력입니다.

Dog* dog = new Dog;
Animal* animal = dog;

다형성 :

그것은 객체 지향 프로그래밍의 개념입니다. 각각의 다른 대상이 각각 고유 한 방식으로 동일한 메시지에 응답 할 수있는 능력을 다형성이라고합니다.

다형성은 모든 클래스가 자체 네임 스페이스에 살고 있다는 사실에서 비롯됩니다. 클래스 정의 내에 할당 된 이름은 외부의 어느 곳에서나 할당 된 이름과 충돌하지 않습니다. 이것은 객체의 데이터 구조의 인스턴스 변수와 객체의 방법 모두에 해당됩니다.

  • C 구조의 필드가 보호 된 네임 스페이스에있는 것처럼 객체의 인스턴스 변수도 마찬가지입니다.

  • 메소드 이름도 보호됩니다. C 함수의 이름과 달리 메소드 이름은 글로벌 기호가 아닙니다. 한 클래스의 메소드 이름은 다른 클래스의 메소드 이름과 충돌 할 수 없습니다. 매우 다른 두 가지 클래스가 동일하게 명명 된 메소드를 구현할 수 있습니다.

메소드 이름은 객체의 인터페이스의 일부입니다. 객체가 무언가를하도록 요청하는 메시지가 전송되면 메시지는 객체가 수행 해야하는 메소드의 이름을 지정합니다. 다른 객체의 이름이 동일한 메소드를 가질 수 있으므로 메시지의 의미를 메시지를받는 특정 객체와 관련하여 이해되어야합니다. 두 개의 다른 객체로 전송 된 동일한 메시지가 두 가지 다른 방법을 호출 할 수 있습니다.

다형성의 주요 이점은 프로그래밍 인터페이스를 단순화한다는 것입니다. 그것은 수업 후 수업 시간에 재사용 할 수있는 규칙을 확립 할 수있게한다. 프로그램에 추가하는 각 새 기능에 대해 새 이름을 발명하는 대신 동일한 이름을 재사용 할 수 있습니다. 프로그래밍 인터페이스는이를 구현하는 클래스와는 별도로 추상적 인 동작 세트로 설명 할 수 있습니다.

예 :

Example-1: 다음은 작성된 간단한 예입니다 파이썬 2.X.

class Animal:
    def __init__(self, name):    # Constructor of the class
        self.name = name
    def talk(self):              # Abstract method, defined by convention only
        raise NotImplementedError("Subclass must implement abstract method")

class Cat(Animal):
    def talk(self):
        return 'Meow!'

class Dog(Animal):
    def talk(self):
        return 'Woof! Woof!'

animals = [Cat('Missy'),
           Dog('Lassie')]

for animal in animals:
    print animal.name + ': ' + animal.talk()

예제 2 : 다형성이 구현됩니다 자바 방법을 사용합니다 과부하 및 방법 우선 개념.

다형성을 논의하기 위해 자동차 예제를 고려해 봅시다. Ford, Honda, Toyota, BMW, Benz 등과 같은 모든 브랜드를 가져 가면 모든 것이 자동차 유형입니다.

그러나 각각의 고급 기능과 이동 동작과 관련된 고급 기술이 있습니다.

이제 기본 유형의 자동차를 만들어 봅시다

car.java

public class Car {

    int price;
    String name;
    String color;

    public void move(){
    System.out.println("Basic Car move");
    }

}

포드 자동차 예제를 구현하겠습니다.

포드는 모든 회원 (속성 및 방법)을 상속하기 위해 유형 자동차를 확장합니다.

포드 Java

public class Ford extends Car{
  public void move(){
    System.out.println("Moving with V engine");
  }
}

위의 포드 클래스는 자동차 클래스를 확장하고 Move () 메소드를 구현합니다. 비록 이동 방법이 상속을 통해 포드에게 이미 사용할 수 있지만 포드는 여전히 자체 방식으로 방법을 구현했습니다. 이것을 메소드 재정의라고합니다.

Honda.java

public class Honda extends Car{
  public void move(){
    System.out.println("Move with i-VTEC engine");
  }
}

Ford와 마찬가지로 Honda는 자동차 유형을 확장하고 자체 방식으로 이동 방법을 구현했습니다.

메소드 오버딩은 다형성을 가능하게하는 중요한 기능입니다. 메소드 오버링을 사용하여 하위 유형은 상속을 통해 사용할 수있는 메소드가 작동하는 방식을 변경할 수 있습니다.

다형성 예비. 자바

public class PolymorphismExample {
  public static void main(String[] args) {
    Car car = new Car();
    Car f = new Ford();
    Car h = new Honda();

    car.move();
    f.move();
    h.move();

  }
}

다형성 예제 출력 :

다형성면 클래스 메인 방법에서, 나는 세 가지 객체 인 포드와 혼다를 만들었습니다. 세 개체는 모두 자동차 유형으로 참조됩니다.

여기에서 슈퍼 클래스 유형이 하위 클래스 유형의 객체를 참조 할 수 있지만 악기는 불가능하다는 점에 유의하십시오. 그 이유는 슈퍼 클래스의 모든 구성원이 상속을 사용하여 서브 클래스에 사용할 수 있기 때문에 컴파일 시간 동안 컴파일러는 사용중인 참조 유형이 액세스하려는 메소드를 가지고 있는지 평가하려고합니다.

따라서, 참조 자동차의 경우, 다형성면에서 F와 H는 이동 방법이 자동차 유형에서 존재합니다. 따라서 컴파일러는 문제없이 컴파일 프로세스를 통과합니다.

그러나 실행 시간 실행과 관련하여 가상 머신은 하위 유형 인 객체의 메소드를 호출합니다. 따라서 메소드 Move ()는 해당 구현에서 호출됩니다.

따라서 모든 객체는 차량 유형이지만 런타임에는 실행은 호출이 발생하는 객체에 따라 다릅니다. 이것을 다형성이라고합니다.

일반적으로 이것은 A 형의 대상이 B 형의 대상처럼 행동하는 능력을 말합니다. 객체 지향 프로그래밍에서 이것은 일반적으로 상속에 의해 달성됩니다. 일부 Wikipedia 링크가 더 읽을 수 있습니다.

편집 : 깨진 링크를 수정했습니다.

다형성은 다음과 같습니다.

class Cup {
   int capacity
}

class TeaCup : Cup {
   string flavour
}

class CoffeeCup : Cup {
   string brand
}

Cup c = new CoffeeCup();

public int measure(Cup c) {
    return c.capacity
}

특정 인스턴스 대신 컵을 전달할 수 있습니다. 이것은 각 컵 유형마다 특정 측정 () 인스턴스를 제공 할 필요가 없기 때문에 일반적인 도움이됩니다.

나는 이것이 좋은 답변이 많은 오래된 질문이라는 것을 알고 있지만 한 문장 답변을 포함하고 싶습니다.

마치 기본 유형 인 것처럼 파생 된 유형을 처리합니다.

위에는 이것을 실제로 보여주는 많은 예가 있지만, 나는 이것이 좋은 간결한 대답이라고 생각합니다.

(나는 완전히 다른 것에 대한 또 다른 기사를 탐색하고있었습니다. 여전히 공유 할 것입니다 ...)

http://www.eioba.com/a/1htn/how-i-ipplained-rest-to-my-wife

이 부분에서 읽으십시오.

..... 다형성. 그것은 다른 명사가 그들에게 동일한 동사를 적용 할 수 있다고 말하는 괴짜 방식입니다.

다형성이라는 용어는 다음과 같습니다.

폴리 = 많은

형태 = 변화 능력

프로그래밍에서 다형성은 개체를 하나 이상의 유형의 물건으로 "보"할 수있는 "기술"입니다. 예를 들어:

학생 대상은 또한 사람의 대상입니다. 학생이 "룩"(예 : 캐스트)가 있다면 아마도 학생 신분증을 요청할 수 있습니다. 당신은 항상 사람과 함께 할 수는 없습니다. (사람은 반드시 학생 일 필요는 없으므로 학생 신분증이 없을 수도 있습니다). 그러나 사람은 아마도 이름이있을 것입니다. 학생도 그렇게합니다.

결론, 다른 "각도"에서 동일한 개체에서 "찾고"다른 "관점"(즉, 다른 속성 또는 방법)을 줄 수 있습니다.

따라서이 기술을 사용하면 다른 각도에서 "볼 수있는"물건을 만들 수 있습니다.

다형성을 사용하는 이유는 무엇입니까? 우선 ... 추상화. 이 시점에서 그것은 충분한 정보 여야합니다 :)

일반적으로 말하면, 동일하거나 피상적으로 유사한 API를 사용하여 여러 가지 다른 유형의 객체를 인터페이스하는 기능입니다. 다양한 형태가 있습니다.

  • 함수 과부하 : SQRT (Float), SQRT (Double) 및 SQRT (복합체)와 같은 동일한 이름 및 다른 매개 변수 유형으로 여러 기능을 정의합니다. 이를 허용하는 대부분의 언어에서 컴파일러는 전달되는 인수 유형에 대한 컴파일러가 자동으로 올바른 것을 선택하므로 컴파일 타임 다형성입니다.

  • OOP의 가상 방법 : 클래스의 방법은 서브 클래스의 세부 사항에 맞게 다양한 구현을 가질 수 있습니다. 이들 각각은 기본 클래스에 주어진 구현을 무시한다고합니다. 기본 클래스 또는 하위 클래스 중 하나 일 수있는 객체가 주어지면 올바른 구현이 즉시 선택되므로 런타임 다형성입니다.

  • 템플릿 : 함수, 클래스 등의 일부 OO 언어의 기능은 유형에 의해 매개 변수화 될 수 있습니다. 예를 들어, 일반 "목록"템플릿 클래스를 정의한 다음 "정수 목록", "문자열 목록", 아마도 "문자열 목록 목록"등으로 인스턴스화 할 수 있습니다. 일반적으로 임의의 요소 유형의 데이터 구조에 대한 코드를 한 번 작성하고 컴파일러는 다양한 요소 유형에 대해 IT 버전을 생성합니다.

비유를 사용합시다. 주어진 뮤지컬 스크립트의 경우, 연주하는 모든 음악가는 해석에 자신의 접촉을 제공합니다.

뮤지션은 인터페이스로 추상화 될 수 있고, 음악가가 속한 장르는 일부 세계적인 해석 규칙을 정의하는 Abstrac 클래스가 될 수 있으며, 연주하는 모든 음악가는 구체적인 클래스로 모델링 될 수 있습니다.

당신이 음악 작품의 청취자라면, 당신은 바흐의 'fuga and tocata'와 그것을 공연하는 모든 음악가들과 예를 들어 스크립트에 대한 언급을 가지고 있습니다.

이것은 가능한 디자인의 예일뿐입니다 (Java).

public interface Musician {
  public void play(Work work);
}

public interface Work {
  public String getScript();
}

public class FugaAndToccata implements Work {
  public String getScript() {
    return Bach.getFugaAndToccataScript();
  }
}

public class AnnHalloway implements Musician {
  public void play(Work work) {
    // plays in her own style, strict, disciplined
    String script = work.getScript()
  }
}

public class VictorBorga implements Musician {
  public void play(Work work) {
    // goofing while playing with superb style
    String script = work.getScript()
  }
}

public class Listener {
  public void main(String[] args) {
    Musician musician;
    if (args!=null && args.length > 0 && args[0].equals("C")) {
      musician = new AnnHalloway();
    } else {
      musician = new TerryGilliam();
    }
    musician.play(new FugaAndToccata());
}

다른 질문에 대한 다형성에 대한 높은 수준의 개요를 제공했습니다.

C ++의 다형성

도움이되기를 바랍니다. 추출물 ...

... 간단한 테스트와 [다형성]의 정의에서 시작하는 데 도움이됩니다. 코드를 고려하십시오 :

Type1 x;
Type2 y;

f(x);
f(y);

여기, f() 일부 작업을 수행하고 가치가 부여되고 있습니다. x 그리고 y 입력으로. 다형성이 되려면 f() 최소한 두 가지 유형의 값으로 작동 할 수 있어야합니다 (예 : int 그리고 double), 유형에 적합한 코드 찾기 및 실행.

(계속해서 C ++의 다형성 )

다형성은 여러 형태로 취할 수있는 물체의 능력입니다. 예를 들어, 인간 클래스 A 남자는 우리가 관계에 대해 이야기 할 때 여러 형태로 행동 할 수 있습니다. 예 : 한 남자는 아들의 아버지이며 아내의 남편이며 학생들의 교사입니다.

다형성은 물체가 여러 형태를 취할 수있는 능력입니다. OOP에서 다형성의 가장 일반적인 사용은 부모 클래스 참조가 아동 클래스 객체를 참조하는 데 사용될 때 발생합니다. 이 예에서는 Java로 작성된이 예에서는 세 가지 유형의 차량이 있습니다. 우리는 세 가지 다른 객체를 만들고 바퀴를 실행하려고합니다.

public class PolymorphismExample {

    public static abstract class Vehicle
    {
        public int wheels(){
            return 0;
        }
    }

    public static class Bike extends Vehicle
    {
        @Override
        public int wheels()
        {
            return 2;
        }
    }

    public static class Car extends Vehicle
    {
        @Override
        public int wheels()
        {
            return 4;
        }
    }

    public static class Truck extends Vehicle
    {
        @Override
        public int wheels()
        {
            return 18;
        }
    }

    public static void main(String[] args)
    {
        Vehicle bike = new Bike();
        Vehicle car = new Car();
        Vehicle truck = new Truck();

        System.out.println("Bike has "+bike.wheels()+" wheels");
        System.out.println("Car has "+car.wheels()+" wheels");
        System.out.println("Truck has "+truck.wheels()+" wheels");
    }

}

결과는 다음과 같습니다.

The Result

자세한 내용은 방문하십시오 https://github.com/m-vahidalizadeh/java_advanced/blob/master/src/files/polymorphismexample.java. 도움이되기를 바랍니다.

다형성은 프로그래머가 해당 객체의 요구에 따라 다른 유형의 객체에 대해 다른 일을하는 동일한 이름의 방법을 작성하는 능력입니다. 예를 들어, 당신이 Fraction 그리고 수업이 전화했습니다 ComplexNumber,이 두 가지 모두라는 메소드가 포함될 수 있습니다 display(), 그러나 그들 각각은 그 방법을 다르게 구현할 것입니다. 예를 들어 PHP에서는 다음과 같이 구현할 수 있습니다.

//  Class definitions

class Fraction
{
    public $numerator;
    public $denominator;

    public function __construct($n, $d)
    {
        //  In real life, you'd do some type checking, making sure $d != 0, etc.
        $this->numerator = $n;
        $this->denominator = $d;
    }

    public function display()
    {
        echo $this->numerator . '/' . $this->denominator;
    }
}

class ComplexNumber
{
    public $real;
    public $imaginary;

    public function __construct($a, $b)
    {
        $this->real = $a;
        $this->imaginary = $b;
    }

    public function display()
    {
        echo $this->real . '+' . $this->imaginary . 'i';
    }
}


//  Main program

$fraction = new Fraction(1, 2);
$complex = new ComplexNumber(1, 2);

echo 'This is a fraction: '
$fraction->display();
echo "\n";

echo 'This is a complex number: '
$complex->display();
echo "\n";

출력 :

This is a fraction: 1/2
This is a complex number: 1 + 2i

다른 답변 중 일부는 다형성이 상속과 함께 만 사용된다는 것을 암시하는 것으로 보인다. 예를 들어, 아마도 Fraction 그리고 ComplexNumber 둘 다 호출 된 추상 클래스를 구현합니다 Number 방법이 있습니다 display(), 어떤 분수와 복합체는 둘 다 구현해야 할 의무가 있습니다. 하지만 당신은 그렇지 않습니다 필요 다형성을 이용하기위한 상속.

적어도 PHP (C ++ 또는 Java에 대해 잘 모르겠다)와 같은 동적으로 유형 된 언어에서 다형성은 개발자가 객체의 유형을 미리 알지 못하고 메소드의 올바른 구현이 의지를 신뢰하지 않고 메소드를 호출 할 수있게 해줍니다. 불리다. 예를 들어, 사용자가 유형을 선택한다고 가정합니다. Number 만들어진:

$userNumberChoice = $_GET['userNumberChoice'];

switch ($userNumberChoice) {
    case 'fraction':
        $userNumber = new Fraction(1, 2);
        break;
    case 'complex':
        $userNumber = new ComplexNumber(1, 2);
        break;
}

echo "The user's number is: ";
$userNumber->display();
echo "\n";

이 경우 적절한 display() 개발자가 사용자가 분수 또는 복소수를 선택하는지 여부를 미리 알 수 없더라도 메소드가 호출됩니다.

객체 지향 프로그래밍에서 다형성은 프로그래밍 언어를 말합니다. 데이터 유형 또는 클래스에 따라 객체를 다르게 처리하는 기능. 보다 구체적으로, 파생 클래스를위한 방법을 재정의하는 능력입니다.

다형성은 말 그대로 여러 모양을 의미합니다. (또는 많은 형태) : 다른 클래스와 동일한 이름 메소드의 객체이지만 워크 플로우는 다릅니다. 간단한 예는 다음과 같습니다.

사람 X를 고려하십시오.

그는 단지 한 사람이지만 많은 행동을합니다. 어떻게 물어볼 수 있습니다 :

그는 어머니의 아들입니다. 친구들과 친구. 그의 여동생의 형제.

OOP의 다형성은 클래스가 다른 유형을 가질 수 있음을 의미하며, 상속은 다형성을 구현하는 한 가지 방법입니다.

예를 들어, 모양 인터페이스입니다 정사각형, , 다이아몬드 하위 유형. 이제 정사각형 물체가 있으면 정사각형이 모양이기 때문에 정사각형을 자동으로 모양으로 업 캐스트 할 수 있습니다. 그러나 모양을 정사각형으로 다운 캐스팅하려고 할 때는 모양이 정사각형이라고 말할 수 없기 때문에 명시 적 유형 캐스팅을 수행해야합니다. 따라서 코드와 같은 코드로 수동으로 캐스팅해야합니다 Square s = (Square)shape, 모양이 원이면 어떻게 될까요? java.lang.ClassCastException, 원은 정사각형이 아니기 때문에.

다형성 :

참조 변수의 유형이 아닌 클래스의 인스턴스에 따라 다른 실행.

인터페이스 유형 참조 변수는 해당 인터페이스를 구현하는 클래스 인스턴스를 참조 할 수 있습니다.

다형성은 주어진 클래스에서 객체를 사용하는 능력이며, 여기서 객체를 구성하는 모든 구성 요소는 주어진 클래스의 서브 클래스에 의해 상속됩니다. 이는이 객체가 클래스에 의해 선언되면, 그 아래의 모든 서브 클래스 (및 가장 먼 서브 클래스에 도달 할 때까지) 객체에 상속되고 구성 요소 (메이크업)가 상속됩니다.

각 클래스는 별도의 파일로 저장해야한다는 것을 기억하십시오.

다음 코드는 다형성을 보여줍니다.

슈퍼 클래스 :

public class Parent {
    //Define things that all classes share
    String maidenName;
    String familyTree;

    //Give the top class a default method
    public void speak(){
         System.out.println("We are all Parents");
    }
}

아버지, 서브 클래스 :

public class Father extends Parent{
    //Can use maidenName and familyTree here
    String name="Joe";
    String called="dad";

    //Give the top class a default method
    public void speak(){
        System.out.println("I am "+name+", the father.");
    }
}

아이, 또 다른 하위 클래스 :

public class Child extends Father {
    //Can use maidenName, familyTree, called and name here

    //Give the top class a default method
    public void speak(){
        System.out.println("Hi "+called+". What are we going to do today?");
    }
}

실행 방법은 시작하도록 부모 클래스를 참조합니다.

public class Parenting{
    public static void main(String[] args) {
        Parent parents = new Parent();
        Parent parent = new Father();
        Parent child = new Child();

        parents.speak();
        parent.speak();
        child.speak();
    }
}

각 클래스는 별도의 *.java 파일로 선언해야합니다. 코드는 컴파일해야합니다. 또한 Maidenname과 FamilyTree를 계속 사용할 수 있습니다. 그것이 다형성의 개념입니다. 상속의 개념은 여기에서도 탐색되며, 여기서 한 클래스가 사용될 수 있거나 서브 클래스로 더 정의됩니다.

이것이 도움이되기를 바랍니다. 코드를 확인하는 데 사용할 수있는 컴퓨터를 찾으면 결과를 게시합니다. 인내심에 감사드립니다!

다형성은 동일한 루틴 (함수, 방법)이 다른 유형으로 작용할 수있게합니다.

기존의 많은 답변이 다형성으로 하위 유형을 혼란시키기 때문에 다형성을 구현하는 세 가지 방법 (하위 유형 포함)이 있습니다.

  • 매개 변수 (제네릭) 다형성 일상은 정상 매개 변수 외에 하나 이상의 유형 매개 변수를 허용하고 해당 유형에서 실행할 수 있습니다.
  • 하위 유형 다형성 루틴이 매개 변수의 하위 유형에 작용할 수 있습니다.
  • 임시 다형성 일반적으로 일상적인 과부하를 사용하여 다형성 행동을 부여하지만 다른 다형성 구현도 언급 할 수 있습니다.

또한보십시오:

http://wiki.c2.com/?categorypolymorphism

https://en.wikipedia.org/wiki/polymorphism_(computer_science)

객체 지향 언어에서 다형성을 사용하면 동일한 인터페이스를 통해 다양한 데이터 유형을 처리하고 처리할 수 있습니다.예를 들어 C++의 상속을 고려해보세요.클래스 B는 클래스 A에서 파생됩니다.A* 유형의 포인터(클래스 A에 대한 포인터)는 클래스 A의 객체와 클래스 B의 객체를 모두 처리하는 데 사용될 수 있습니다.

코딩 용어의 다형성은 객체가 상속을 통해 여러 유형으로 존재할 수있을 때입니다. "Shape"라는 이름의 클래스를 작성하는 경우 객체의 측면 수를 정의한 다음 "Square와 같은 상속 된 새 클래스를 만들 수 있습니다. ". 그런 다음 "정사각형"인스턴스를 만들 때 필요에 따라 "모양"에서 "Square"로 앞뒤로 캐스트 할 수 있습니다.

다형성은 하나의 모듈을 다른 모듈을 호출 할 수있는 능력을 제공하지만 제어 흐름 대신 제어 흐름에 대한 컴파일 시간 의존성 지점을 갖습니다.

다형성을 사용함으로써 높은 수준의 모듈은 저수준 모듈에 의존하지 않습니다. 둘 다 추상화에 의존합니다. 이것은 우리가 의존성 반전 원칙을 적용하는 데 도움이됩니다 (https://en.wikipedia.org/wiki/dependency_inversion_principle).

위의 정의를 찾은 곳입니다. 비디오에 약 50 분 동안 강사가 위의 사항을 설명합니다.https://www.youtube.com/watch?v=tmuno5rznee

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top