루비의 다형성과 오리 입력하면
2 페이지 1
다형성은 변경되지 않은 남은 반면, 런타임 동작을 생성하는 소스 코드 부분의 사용이 가능한 프로그래밍 기법입니다.
만들기 다형성 코드는 객체 지향 프로그래밍에서 특정 의미가 : 인터페이스를 구현하는 모든 클래스의 분류 체계를 만드는 것을 의미합니다.
면 예를 들어, 내 인터페이스는 알고리즘 실행을 변경할 수있는 방법 "getArea",이 인터페이스는 이것이 우리 다형성 방법을 쓸 수있는 방법 "getArea"을해야합니다 구현하는 각 클래스, 메서드를 정의 인자로 전달되는 객체의 종류에 따라.
기존의 OOP 언어의 다형성
Java에서 -하지만 같은가 C 마찬가 + +과 다른 언어, 객체 지향 (OO) 완료, 그땐 루비의 경우를 건네 줄 것이다 - 예를 들면 :
인터페이스 IFormaGeometrica
{
무효 getArea ();
}
공개 수업 삼각형 IFormaGeometrica을 구현
{
@ 무시
공공 INT getArea ()
{
반환 (* this.base this.altezza) / 2;
}
}
이 경우 우리는 "이다"고 모든 개체가 FormaGeometrica getArea이 방법을 써야합니다 나타내는 인터페이스 IFormaGeometrica 정의 - 같은 수준의 삼각지, FormaGeometrica이며, 우리가 프로그램을 작성할 수 있습니다 getArea의 자체 구현을 가지고 어떤 기하학적인 모양의 영역을 계산하는 능력이 지금의 코드에 존재하며 원래 소스 코드를 변경하지 않고, 미래에 구현된다는 것입니다.
사실, 제가 수업 계산기를 작성하는 경우 :
공공 최종 클래스 계산기
{
공공 정적 무효 메인 (문자열 [] 인수)
{
컬렉션 형태 <IFormaGeometrica> =
<IFormaGeometrica> 새로운 ArrayList를 ();
forme.add (새 삼각형 ());
forme.add (새 광장 ());
forme.add (새 국방부 ());
(양식 g IFormaGeometrica)에 대한
{
System.out.println (g.calcolaArea ());
}
}
}
이것은 입력으로 컬렉션에있는 각 객체가 인터페이스 IFormaGeometrica를 구현해야함을 제공하는 기하학적인 형태의 컬렉션을, 수, 그것은 본질적으로 메서드 getArea 있습니다.
이 예제의 자바는 순전히 학문이다 : 사실, 아마 각 클래스의 생성자에서 우리는 입력 기하학, apothem, 등등의 측면의 조치를 예측했다.
목적은 달성된다 : 우리는 어떤 기하학적인 모양의 영역을 인쇄할 수있는 클래스를 썼습니다. 그것은 미래에 구현되고 있는지, 그것은 이미 (삼각형의 경우 등) 적용되었는지 코드를 모두 반복합니다.
뿐만 아니라 그 : 삼각형 면적 계산의 구현 버그를 포함하고있다면, 나는 수업 계산기를 다시 작성할 필요없이 삼각형 클래스를 변경할 수 있습니다. 아마도 후자는 각 변경 사항을 다시 시작해야 서버에 배포되었습니다 :이 경우에는 코드를 변경해야하는 것은 큰 장점이 아닙니다. 그러나 그 이외 항상 모든 변화가 잠재적인 버그로 가져다 때문에 코드의 일부는 "변화"를 제한하는 것이 유리합니다. 반대로, 그것은 좋은 프로그래밍 연습은 항상 변하지 남아 코드의 어떤 부분을 확실하게 알고있다.
어떤 컴파일러 다형성 코드 안의 모든 객체는 클래스 계산기의 주요 메소드 인터페이스를 구현하도록합니다 점이다 "장면 뒤에서"발생합니다. 이러한 방식으로, 그들은 계약에 의한 설계의 방법론을 사용하여 표현이라고, "계약은 존중입니다."
그렇지 않다면 "양식"은 IFormaGeometrica는 컴파일 타임에 오류가 아니고, 또는 컴파일러가 오류를 발견 있기 때문에 우리가 심지어 프로그램을 실행하지 당할 것이다 구현하는 클래스의 객체를 가지고있다 그 경우.
루비의 다형성
그런데 루비에 어떻게됩니까? 그리고 컴파일하지만, 다형성 방법을 쓰기, 언어를 해석하지 않는 루비에 '가능?
예, 그것은 확실히 가능하지만, 깊은 차이 OO 언어보다는 '철학'과 컴파일이되는
우리는 그것을 표현할 수. Java 및 고전에서 OO 프로그래밍에서 명시적으로 상위 클래스에서 객체를 파생해야 개체가 개체의 특정 형식 (특정 인터페이스를 구현하는)에 속하는 것을 확인하기 위해 : 기본적으로 당신은 (상속 상속의 기술을 사용해야 클래스에 의해, 추상 클래스 또는 인터페이스).
그것은 말하는 것 같습니다 이것이 내 앞에 오리인지 여부를 확인하려면, 난 그냥 오리 것이 있는지 연구실에서 자신의 DNA와 연구를 가져가라.
루비에서는 제임스 라일 리가 발명한 "오리 테스트를"(오리 테스트) (참조 사용하고 http://en.wikipedia.org/wiki/Duck_typing~~V을 ) :
그것이 오리처럼 걷고 오리처럼 꽥꽥 거리면, 그때 그것은 오리입니다.
(어느 덧붙여 그는 오리를 볼 때 우리 각자를 만드는 것입니다.)
이것은 무엇을 의미할까요? 그것은 루비에서 더 일반적으로 파이썬은 Perl과 같은 객체 지향 스크립팅 언어로, 인터페이스도 클래스 간의 명시적인 상속 관계를 지정할 필요가 없다는 것을 의미합니다.
방법은 특정한 방법을 "해야"하는 다형성 개체를 넘으면 프로그래머는, 우리가 실제로있다는 걸 간단히 인터프리터 "트러스트".






