2011-03-24 2 views
1

현실 세계에서는 사람들이 (어떤 유형의 문제를 해결하기 위해) 이것을 사용합니까? 함께 작동하는 예제 코드를 볼 수 있습니까? 내가 찾을 수있는 것은 말하는 고양이와 개에 관한 코드 또는 우유 나 커피를 마시는 사람들에 관한 코드입니다 ...Java의 다형성과 인터페이스 (인터페이스를 구현하기 위해 다형성을 사용할 수 있습니까?)

사람들은 실제로 인터페이스로 다형성을 구현합니까? 무엇 때문에?

+4

고양이와 개 예제를 사용하려면 (한숨, 나도 알아) ... ** 고양이를 개로 바꾸는 것을 생각하지 마십시오. ** 다른 동물과 마찬가지로 고양이를 치료한다고 생각하십시오. 그런 식으로 누군가가 당신에게 개를 주기로 결정했다면, 고양이와 같은 일을 할 수 있습니다. '먹이 (음식 f)'그것. 'ensureBathroomCapabilities()'를 사용하십시오. '그것 (장난감 t)'을 가지고 놀아 라. 개에게 할 수없는 뭔가를 고양이에게하지 마십시오. – corsiKa

+1

위키 피 디아의 디자인 패턴에 대해 읽어보십시오. 그들은 매우 유용하며 종종 인터페이스로 다형성을 사용합니다. http://en.wikipedia.org/wiki/Design_pattern_ (computer_science) – Kurru

답변

9

를 봐

public static void main(String [] args){ 

    Log myLog(); 
    FileLogger myFile(); 
    ConsoleLogger myConsole(); 

    myLog.registerLogger(myFile);  
    myLog.registerLogger(myConsole); 

    myLog.log("Hello World!!"); 
    myLog.log("Second log event!"); 
} 

희망이 INTERF을 이해하는 데 도움이 : 로거 시스템의 동작을 다음과 같이 다음

interface ILogger{ 

    public void handleEvent (String event); 
} 

class FileLogger implements ILogger{ 

    public void handleEvent (String event){ 
     //write to file 
    } 
} 

class ConsoleLogger implements ILogger{ 

    public void handleEvent (String event){ 
     System.out.println(event); 
    } 
} 

class Log { 

    public void registerLogger (ILogger logger){ 

     listeners.add(logger); 
    } 

    public void log (String event){ 

     foreach (ILogger logger in listeners){ 

      logger.handleEvent(event); //pass the log string to both ConsoleLogger and FileLogger! 
     } 
    } 

    private ArrayList<ILogger> listeners; 
} 

, 당신은 그것을 사용할 수 에이스 및 다형성.

1

예제로 Map/AbstractMap/HashMap의 코드를 살펴보십시오. 길 아래에, 내가 HashMap에의 메모리 오버 헤드가 너무 많이 결정하면 당신은 (src.zip 단위) JDK와 함께 제공되는 JDK 소스의 다른 예 수천을 찾을 수

7
Map<String,Person> peopleByName = new HashMap<String,Person>(); 

, 나는 재 수 TreeMap과 같이이 작업을 수행하고, peopleByName는지도가 아닌 트리 맵 또는 HashMap에 있기 때문에 약간 더 비싼 조회 시간

Map<String,Person> peopleByName = new TreeMap<String,Person>(); 

살고, 내 모든 통화에 관계없이 구현 중 하나를지도에서 작동하도록 보장합니다.

가장 다음 예

public class CatsAndDogsDrinkingMilkAndCoffee { 

    // what, no? :-(

} 
4
interface Request { 
    Response execute(); 
} 
interface Response { 
    String serialize(); 
} 
class RequestProcessor { 
    void processRequest(Request r) { 
    logger.log("Request: " + r); 
    Response s = r.execute(); 
    logger.log("Response: " + s); 
    connectionManager.write(r.serialize()); 
    } 
} 

말이 예제와 함께 설명되어, RequestProcesor이

1

이 상상할 요청 및 응답의 구현에 대해 알 필요가 없다 "누군가가"설계 거대한 프로그램, lotsa 코드. "그 누군가"가 일부 컨트롤러 논리의 설계에서 인터페이스를 사용한다고 가정 해보십시오. 이제는 전에 보지 못했던이 코드로 작업하기 위해 고용되었습니다. 새 컨트롤러 클래스를 설계하라는 메시지가 나타납니다. 지금해야 할 일은 인터페이스를 구현하고 모든 메소드를 작동시키는 것입니다.

누군가 인터페이스를 사용하지 않았다면 컨트롤러를 재 설계해야 할뿐만 아니라 컨트롤러 클래스와 나머지 클래스 간의 강력한 결합이있을 수 있으므로 잠재적으로 전체 프로젝트를 재 설계해야 할 것입니다 . 이 코드를 이해하기 위해 몇 달이 걸릴 것입니다. 아마도 새로운 버그 집합은 말할 것도 없습니다.

1

거의 모든 Java 응용 프로그램이 GUI를 사용합니다 (물론 GUI뿐 아니라 ...). 예를 들어, 다형성 달성하기 위해 클래스 및 인터페이스를 사용하여 다음

이의 "관찰자"패턴의 구체적인 예입니다 (...이 처음 내 마음에 온다) android VideoView의 소스에서 물론

1

"실제 세계"에 대한 또 다른 제안은 스프링 배치를 사용하는 것입니다. "데이터 가져 오기, 보고서 만들기,받는 사람에게 보내기"와 같은 패턴을 따르는 일반적으로 사용되는 보고서 형식을 사용하는 경우이 표준을 적용하는 보고서 인터페이스를 만들 수 있습니다. 이 의미에서 모든 배치 보고서가 따르는 "템플릿"처럼 작동합니다.

지루한 예,하지만

0

가 어떻게 LINQ .NET 작품 궁금해 ... 나는 내 첫 해에 직면 뭔가? 그것은 모두 인터페이스와 다형성에 관한 것입니다.

프로젝트에 대한 작업이 필요하다면 모든 것에 대해 알게 될 것입니다.

관련 문제