2011-12-08 5 views
0

에서 문자열을 얻을 내가 가진 상상이 :자바 서브 클래스

public class Animal { 
    private String racaAnimal; 
    private String corAnimal; 

    public String getCorAnimal() { 
     return this.corAnimal; 
    } 

    public String getRacaAnimal() { 
     return this.racaAnimal; 
    } 

      public Animal getAnimaisCliente(int indice) { 
        return this.animaisCliente[indice]; 
      } 
} 

public class Estimacao extends Animal{ 
    private String nomeAnimal; 

    public String getNomeAnimal() { 
     return nomeAnimal; 
    } 
} 

public class Cliente{ 
    private Animal[] animaisCliente; 
} 

생성자가 표시되지 않는 그러나 그들은 잘 작동하고 있습니다.

나는 모든 Cliente

ArrayList<Cliente> clientes = new ArrayList<Cliente>(); 

그리고 동물을 보유하고 하나 개의 ArrayList는 Cliente

에서 동물의 배열에 이제 경우

를 추가 한 후 그이

Estimacao animaisEstimacao = new Estimacao(nomeAnimal,racaAnimal,corAnimal); 

과 같이 생성 한 나는 이렇게한다 :

System.out.println(" Raça: " + clientes.get(0).getAnimaisCliente(0).getRacaAnimal()); 

그것은 작동합니다. 하지만 Estimacao 수업에서 nomeAnimal을 (를) 어떻게 얻을 수 있습니까?

내가

System.out.println(" Nome: " + clientes.get(0).getAnimaisCliente(0).getNomeAnimal()); 

을 두는 경우에 그것은하지 작업을한다.

하위 클래스에서 우리는 수퍼 클래스에서 물건을 얻을 수 있지만 다른 방법으로 arroud? 그것은 가능한가?

+0

나는이 질문을 완전히 이해하지는 못했지만 추상적 인 방법이 요구 사항을 충족시킬 것이라고 생각한다. – emory

답변

2

System.out.println(" Nome: " + ((Estimacao) clientes.get(0).getAnimaisCliente(0)).getNomeAnimal()); 
+0

고마워요.하지만 한 가지 질문 만합니다. ((Estimacao) clientes.get (0) .getAnimaisCliente (0)) 동물을 Estimacao로 캐스팅하는 것은 무엇입니까? – Favolas

+0

그렇습니다. 즉, 한 동물은 Estimacao가 아니므로 실패합니다 (ClassCastException). – Guillaume

+0

'Estimacao extends Animal' 인스턴스로 캐스팅하기 전에 실제로 확인해야합니다. 따라서'Animal'을'Estimacao'로 다운시킬 수 있습니다. 고민 자분의 질문이 있으신가요? – korifey

5

당신은 당신의 AnimalEstimacao에 캐스팅 할 필요가보십시오. 당신은 예외 위험을 감수하고 싶지 않아하지만 분명히, 당신의 Animal 전에 올바른 클래스 있는지 확인 :

Animal animal = clientes.get(0).getAnimaisCliente(0); 
if (animal instanceof Estimacao) { 
    System.out.println(" Nome: " + ((Estimacao) animal).getNomeAnimal()); 
} 
+0

위대하다. 이제 이런 종류의 가능한 예외를 제어하는 ​​방법을 알고 있습니다. – Favolas

0

Estimacao

0

에 정의 된 메소드에 액세스 할 EstimacaoAnimal 캐스트 그것은 너가 묻고있는대로 직접적으로 가능하지 않다. 그러나 기본 클래스 (Animal)에 getNomeAnimal()을 추가하면 null 또는 빈 문자열이 반환되고 Estimacao 클래스 인스턴스는 올바른 값을 반환합니다. 그것의

this.animaisCliente[indice] // animaisCliente is not an attribute of Animal 
0

이것은 당신의 동물 클래스의 위치 오류 사용입니다. 그러나 수퍼 클래스의 인스턴스가 반드시 해당 서브 클래스의 인스턴스 일 필요는 없습니다. 따라서 수퍼 클래스 메서드는 항상 두 가지 모두에서 사용할 수 있지만 하위 클래스 메서드는 하위 클래스에서만 사용할 수 있습니다.

하위 클래스의 인스턴스가 있다고 확신하는 경우 명시 적으로 형변환하고 이에 대한 하위 클래스 별 메서드를 호출 할 수 있지만주의해야합니다.

3

생각해이 방법 : 서브 클래스의 인스턴스 또한 슈퍼 클래스의 인스턴스

0

아니요. 동물 유형 개체를 Estimacao 유형으로 캐스팅하지 않으면 수행 할 수 없습니다. 캐스트 한 후에 만 ​​getNomeAnimal()을 사용할 수 있습니다. 그러나 이것은 나쁜 일입니다. 배열에 Animal 유형과 Estimacao 유형 객체가 혼합되어 있으면 ClassCastException으로 실패합니다.

+0

당신이하고있는 것을 알 때 반드시 나쁜 것은 아니지만, 캐스팅하기 전에 반드시 확인해야합니다. 그리고 어쨌든, 보통 캐스팅하는 것은 나쁜 디자인을 나타냅니다. 따라서 완전히 다시 방문해야 할 수도 있습니다. – Guillaume

+0

전적으로 동의합니다. 그러나 배열에 다른 하위 유형의 객체가 없다는 것을 알고있는 경우 Animal 대신 Estimacao 객체 배열을 가질 수 있습니다. 그러나 현재의 이행을 완전히 방문 할 필요가 있음에 동의합니다. – Drona

+0

"내가 뭘하는지 알았을 때"라고 말했을 때, 각 캐스트 – Guillaume

1

위에서 제공 한 답변 외에도 수업의 일반적인 디자인을 고려하는 것이 좋습니다. nomeAnimalAnimal 클래스가 실제로 알고 있어야하는 것이면 변수의 이름조차도 Animal -ness를 의미하는 것처럼 그것을 밀어 올리는 것이 좋습니다.

하지 않으면, 당신은 더 Animal 클래스에 displaySpecificInfo()를 추가하고 다형성을 활용하는 것이 좋습니다하거나 그것을 abstract하고, 또는 Animal 클래스의 빈 구현을 추가. 이렇게하면 현재 실패한 인쇄 호출이있는 위치에서 호출 한 다음 파생 클래스의 구현에 현재 행을 가질 수 있습니다. 이렇게하면 캐스트에 대한 필요성이 줄어들며 (더 이상 캐스팅에 문제가있는 것이 아니라) 더 많은 OO/캡슐화를 준수하는 구현을 만들 수 있습니다.

편집 : 잠재적 OO 양파의 층 이상을 벗겨 대한 @Guillaume 내 사과로

우수한 노트는 다음에 관심이! :)

+1

+1 이전에 올바른 클래스 (instanceof 또는 isAssignableFrom 사용)를 확인했을 때 의미가 있었지만 처음에는 기본을 얻고 싶다고 생각했습니다. :) 나는 또한 상속 대신 컴포지션을 사용하여 제안하려고했지만 범위가 약간 벗어났습니다. – Guillaume