2014-05-10 3 views
0

Java의 관리 클래스 및 인터페이스에 문제점이 있습니다. 인터페이스 Superhero와 Human이라는 다른 인터페이스가 있습니다. 그런 다음 나는 PeterParker와 같이 Human type의 다양한 classe를 사용합니다. 나는 인간 개체를 만들 때관리 클래스 및 인터페이스 Java

public interface HumanAndSuper{ 

     public Superhero fromHumanToSuperhero(); 
     public Human fromSuperheroToHuman(); 


    } 
    public interface SuperHero{ 

     public void attacks(); 

    } 

는, 예를 PeterParker를 들어,이 클래스에서 나는 개인 중첩 된 슈퍼 히어로 클래스가 : 끝에 나는이 방법을 가지고 HumanAndSuper라는 인터페이스를 가지고있다. 예 :

 public class PeterParker implements Human,HumanAndSuper{ 
     //Constructors 

      public Superhero fromHumanToSuperhero(){ 
       //the human turns into superhero associated 
       return new Spiderman(); 
      } 
      public Human fromSuperheroToHuman(){ 
      //the superhero becomes a human 
       return this; 
      } 
public void speaks(){//It's a example 
    //Implementation 
} 

     private class Spiderman extends PeterParker implements SuperHero{ 


      public void attacks(){ 
       //Implementation 
      } 
     } 

     } 

실제로 인간의 수퍼 히어로 상대의 구현은 인간의 동일한 클래스의 내부이다. 내가 원하는 것은 동일한 변수를 가진 인간을 인스턴스화 할 수 있다는 것입니다. 인간과 슈퍼 히어로를 반대로 전달할 수 있습니다. 예 :

PeterParker peter=new PeterParker();//Human 
peter.speaks(); 
peter=peter.fromHumanToSuperhero();//peter becomes spiderman 
peter.attacks();//method in Spiderman class 
peter=peter.fromSuperheroToHuman();//spiderman becomes Human 

어떻게하면됩니까?

+0

'PeterParker'는'SuperHero'가 아니므로,'peter = peter.fromHumanToSuperhero();'라는 지정은 작동하지 않습니다. 여기서 무엇을 이루려고하는지 명확하지 않습니다. 당신은 정교 할 수 있습니까? –

+0

다른 컨텍스트에서 다른 메서드 집합을 허용하는 방법은 무엇입니까? Java에서 캐스팅을 통해서만 가능합니다. 특정 컨텍스트 (예 :''IllegalStateException'')에서 메소드가 허용되지 않는 경우 예외를 throw하여 가능합니다. (아마도 좀 더 ...) – Andy

+0

전략 패턴에 대해 읽어야합니다. 이처럼 [어떻게 전략 패턴 작업?] [1] [1] : http://stackoverflow.com/questions/91932/how-does-the-strategy-pattern-work – shadrus

답변

2

나는 당신이 클래스의 인스턴스를 만들고 그 인스턴스를 다른 클래스의 인스턴스로 만들려고한다는 것을 이해하는 한. Java에서는 불가능합니다.

그러나 인스턴스의 동작을 동적으로 변경하려면 Decorator 패턴을 살펴 보시기 바랍니다. 객체 지향 프로그래밍

는 (도 래퍼 어댑터 패턴과 공유하는 다른 이름이라고도 함) 장식 패턴은 정적, 동작은 개별 객체에 추가 될 수있는 디자인 패턴 또는 동일한 클래스의 다른 개체의 동작에 영향을주지 않고 동적으로 수행 할 수 있습니다. 당신이 할 수있는 것은 다음과 같다 1

+0

"당신은 클래스의 인스턴스를 만들고, 그 인스턴스를 다른 클래스의 인스턴스로 만들려고합니다. 자바에서는 불가능합니다." 확실합니까? 다형성의 전체 개념은 어떻습니까? String의 인스턴스가있는 경우이를 객체의 인스턴스로 참조 할 수도 있습니다. – jordan

+0

Object 변수를 통해 String 인스턴스를 참조 할 수 있지만 여전히 Object (String의 특정 경우)입니다. – Andres

+0

문자열은 "개체"입니다. – jordan

0

:

  1. 가 되세요 Human 및 구현하는 자신의 방법과 SuperHerointerface (완료)
  2. 이 전자를 구현하는 HumanAndSuper 추상 클래스, 2 클래스 (여기에 그 열쇠가 있습니다)
  3. HumanAndSuper 클래스에는 현재 사람이 또는 슈퍼 히어로인지 알려주는 개인 속성을 추가하고 r 그것에 대한 논리 012
  4. 귀하의 Implementation class에서 귀하의 인터페이스 방법을 구현합니다. Human, SuperHeroHumanAndSuper에서, 모든 메소드를 호출 할 수 있습니다 :

은 이제 객체 (peterParker 예)가 있습니다.

인간 형태의 경우 (예를 들어) attack()을 사용하지 않으려면 HumanAndSuper 클래스에 인터페이스 메소드를 구현하고 올바른 선언을해야합니다 (위의 선언 된 개인 속성 사용).).

이 동작을 달성하는 다른 (더 안전한) 방법이 있지만 더 복잡합니다.