2012-01-13 4 views
0

다음과 같은 문제가 있습니다. 다형성 호출을 만들려고하는데 그 결과는 기본 클래스에 따라 값을 변경하는 변수에 따라 달라집니다. 그러나 다른 것들을 시도했지만 작동하지 않습니다. 무엇이 바뀌어야하는지 알려주세요.다형 호출은 변수에 따라 다릅니다.

class Cycle{ 
    private int w = 0; 
    public void move(){ 
     System.out.println("Cycle moving"); 
    } 
    public int wheels(Cycle c){ 
     switch (c.w){ 

      case 1:  return 1; 
      case 2:  return 2; 
      case 3:  return 3; 
      default: return 0; 
     } 
    } 
} 
class Unicycle extends Cycle{ 
    public int w = 1; 
    public void go(){ 
     System.out.println("Unicycle go"); 
    } 
} 
class Bicycle extends Cycle{ 
    public int w = 2; 
    public void go(){ 
     System.out.println("Bicycle go"); 
    } 
} 
class Tricycle extends Cycle{ 
    public int w = 3; 
    public void go(){ 
     System.out.println("Tricycle go"); 
    } 
} 

public class TestCycle { 

    public static void ride(Cycle c){ 
     c.move(); 
     int now = c.wheels(c); 
     System.out.println(now); 

    } 

    public static void main(String[] args){ 
     Bicycle b = new Bicycle(); 
     ride(b); 
     Unicycle u = new Unicycle(); 
     ride(u); 
     Tricycle t = new Tricycle(); 
     ride(t); 
    } 

} 
+0

코드에 실제로 나쁜 점이 있습니다. 서브 클래스에서'int w'를 다시 선언하십시오. 변수를 숨기거나 숨기는 것입니다. 나는 언어의 디자이너가 왜 그것을 허용했는지 이해하지 못한다. – toto2

+1

또한 3 개의 서브 클래스에'go' 메소드가 있다는 것이 이상하게 보입니다. 그들은'go' 메소드를 가진 무언가의 서브 클래스 여야합니다. – toto2

+0

@ toto2'Cycle.w'가 private이기 때문에 그것은 작동합니다. 그래서 그것의 상속인들에게는 unacessible입니다. 따라서 그림자가 없습니다. – Viruzzo

답변

2

문제 (그 중 하나)는 각 하위 클래스에서 클래스 변수 'w'를 다시 정의한다는 것입니다. 그것을 'Cycle'의 멤버로 정의하고 각 하위 클래스가 생성자에서 올바르게 설정되도록합니다.

class Cycle{ 
    protected int w; 
    public void move(){ 
     System.out.println("Cycle moving"); 
    } 
    public int wheels(){ 
     return w; 
    } 
} 

class Unicycle extends Cycle{ 
    public Unicycle() { 
     w = 1; 
    } 
    public void go(){ 
     System.out.println("Unicycle go"); 
    } 
} 

또는 당신은 슈퍼 클래스에서라는 추상 메소드 '바퀴를() 정의하고 서브 클래스에서 재정의 할 수 있습니다. 그것은 맛의 문제입니다.

+0

이 경우'w'는'private'이 아니라'protected'이어야합니다; 그렇지 않으면 서브 클래스가 액세스 할 수 없습니다. – Poindexter

+0

고마워요 Poindexter, 난 그냥 복사하고 OP 코드를 붙여 넣기 않았다 – brain

+0

생성자없이 그것을 할 수있는 방법이 있습니까? 나는 다형 적 방법을 선호한다. 고맙습니다. – aretai

1

차륜 방법보다

같아야 : 문제 CW 읽기 모두 디폴트 값이 0으로되고, w는 로컬 변수가 적절한 클래스 중 하나를 읽더라도 항상 여기서 0 디폴트 코드가 있다는
public int getWheelCount(){ 
    return this.w; 
} 

인스턴스 자체에서 호출하면 인수를 전달할 필요가 없습니다. 현재 인스턴스가 세발 자전거 일 경우 메서드는 3을 반환합니다.

+0

개인 정보는 제외하고 가능합니다. 그것을 액세스하지 마십시오. – Viruzzo

+0

Viruzzo, 고맙습니다, 나는 그것을 놓쳤다는 것을 믿을 수 없습니다. – hvgotcodes

+0

나는 그것을 시도했지만, 여전히 0을 리턴한다. 이것은 사이클에서 w이다. 전체 코드를 표시 할 수 있습니까? 감사합니다. – aretai

1

아마도 당신이 찾고있는 대답은 아니지만 다음과 같은 작업이 가능합니다. 자신이하려는 일에 대해 더 자세히 알려주십시오. 내가 이제까지 인스턴스화 할 싶지 않기 때문에 나는 Cycleabstract했다

public abstract class Cycle { 
    protected int nWheels; 
    protected String goText; 

    // no constructor. 

    public void go() { 
    System.out.println(goText); 
    } 

    public int wheels() { 
    return nWheels; 
    } 
} 
... 

public class Unicycle extends Cycle { 

    public Unicycle() { 
     nWheels = 1; 
     goText = "Unicycle go"; 
    } 
} 

참고.

편집 :

public static int getNumberOfWheels(Cycle cycle) { 
    return cycle.wheels(); 
} 

cycle.wheels()에 대한 간단한 호출이 함수를 호출과 동일 할 것이기 때문에 분명히 매우 유용하지 않습니다.

생성자를 피하려는 이유가 확실하지 않습니다. 어쩌면 대답하려고하는 정확한 질문을 써야 할 것입니다.

+0

네, 작동합니다. 각 클래스에 대한 생성자없이 적절한 방법으로 만 생성하는 방법을 알고 있습니까? – aretai

+0

나는 당신이 뭔가를하려고 노력하고 있었다는 느낌이 들었습니다. 내 편집을 참조하십시오. – toto2

1

Cycle.w은 개인이므로 상속인에게는 표시되지 않습니다. 예를 들어 Tricycle.w는 "동일한"변수가 아니며 Cycle에서 보이지 않습니다 (항상 0이되는 이유입니다). Cycle.w을 최소한 보호해야하고 모든 하위 클래스에서 w를 제거하고 각 하위 클래스의 생성자에서 원하는 값으로 설정하십시오.

관련 문제