2013-02-21 5 views
1

Java에서 부모 클래스 및 하위 클래스의 참조를 만들어야하는 이유는 무엇입니까? 우리는 이것으로 무엇을 달성 할 수 있습니까? 명백한 대답은 다형성이지만 범위는 무엇입니까? 실시간으로 어떻게 도움이됩니까? 자바를 배우면서 나는 이것을 보았습니다.상위 클래스 및 하위 클래스의 참조

+0

패러다임에 대해 이야기하고 있다고 가정합니다. List foo = new ArrayList (); ? – Trasvi

+0

다형성이 어떻게 도움이되는지 알고 싶습니까? –

+1

확인하십시오. [대답 1] (http://stackoverflow.com/a/12159803/2024761), [대답 2] (http://stackoverflow.com/a/2482808/2024761) – SudoRahul

답변

1

예를 들어, 부모 클래스 참조를 사용하면 전달되는 특정 유형의 목록을 신경 쓰지 않고 모든 종류의 List를 취해서 작동하는 메서드를 작성할 수 있습니다.

반면에 하위 클래스는 실제 구현을 지정하므로 메서드의 사용자는 자신의 요구 사항에 가장 효율적이거나 적절한 목록을 선택할 수 있습니다.

당신이 목록의 합을 계산하는 방법을 쓰기 가정 :

int sum(List<Integer> input); 

는 이제 방법의 한 사용자가 자신이에 대한 빠른 랜덤 액세스를 관심있는 목록을 가지고 가정을, 그래서 그는 동안, ArrayList에를 생성 다른 사용자는 자신의 목록을 자주 연결하고 결합하려고하므로 대신 LinkedList를 사용합니다.

이 두 사용자는 이제 sum 메소드를 사용할 수 있습니다.

0

다형성이 실제 생활에서 당신을 어떻게 돕습니까?

다른 인수 또는 구현을 수용하기 위해 코드의 유연성을 높이십시오. 예를 들어
, 하나는 방법을 생각할 수 :

void foo(ArrayList<T> arg) { 
    for (T t : arg) { 
    // do something 
    } 
} 

우리가 정말 ArrayList에 수용에만이 방법을 제한해야합니까? 결국 우리가 사용하고있는 함수는 LinkedList 또는 Set에서 똑같이 수행 될 수 있습니다. 우리가 대신 쓴 경우에도 더 많은 기능이 될 것입니다 :

void foo(Iterable<T> arg) { 
    for (T t : arg) { 
    // do something 
    } 
} 

마찬가지로, 우리가 작성하는 경우 : 우리가 인수에 사용할 방법이 ArrayList에 만 사용할 수있는 경우

ArrayList<T> arg = new ArrayList<T>(); 

이는 유용합니다. 우리가 원하는 방법의 ArrayList의 슈퍼 클래스에 선언하는 경우, 우리는로 변경하여 우리의 코드를보다 유연하게 할 수 있습니다 우리가 실제로 인수 정렬 될 필요가 있다고 결정하면 다음

Collection<T> arg = new ArrayList<T>(); 

그리고, 우리는 변경 될 수 있습니다 아주 쉽게

우리의 코드에서 다른 작업을 깨지 않고
Collection<T> arg = new PriorityQueue<T>(); 

에 그것, 그것이 ArrayList의를 받아 들일 것 같은 foo는()는 그냥 즐겁게 사용해, PriorityQueue을 지불 할 용의가 있기 때문에. 서브 클래스에 대한 특정 구현 세부 사항에 의존하지 않으시면, 매우 빠르게 로트를 변경할 수 있습니다.

의견에서 언급했듯이 매우 간단한 예제를 통해 설명하면 더 강력 해집니다. 데이터베이스와 인터페이스하는 응용 프로그램이 있다고 가정 해 보겠습니다.우리의 데이터베이스는 MySQL의 경우, 당신은 매우 구체적인 MySQL의 코드를 작성에 잡힐 수 있습니다 사람들을 많이 후

MySQL db = new MySQL(); 
int results = db.mySqlExecute("SELECT count(*) FROM names WHERE firstname = 'Bobby';"); 

(주, 영원히 그래서 이것은 완전히 인위적인이다의 모든 JDBC 물건을하지 않은) 커다란 응용 프로그램이라면, 여러분의 코드는 MySQL로부터 완전히 확장 할 수 없으므로 PostgreSQL이나 다른 어떤 데이터베이스 시스템도 구현할 수 없습니다.

DataBase db = new MySQL(); 
int results = db.getCount("names", "firstname = 'Bobby'"); 

을 당신은 쉽게

DataBase db = new PostgreSQL(); 

에 첫 번째 라인을 변경하고 코드가 하나의 간단한 변화에 잘 작동합니다 : 대신하는 경우가 물품. 이것이 다형성의 힘입니다. 단일 구현에 묶이지 않습니다.

관련 문제