2012-01-17 4 views
2

A를 확장하고 A를 확장하는 클래스 B가 있으며 하위 클래스입니다. 지금은상속 및 다형성 - 이해

A aObject = new A(); and 
A bObject = new B(); 

지금 내가 타입 캐스팅없이 사용 bObject에없는 클래스 B의 메소드를 호출 할 수 있나요?

우리가 타입 캐스팅없이 그렇게 할 수 없다면 다형성의 이점은 무엇입니까?

감사합니다.

+0

을 말할 수있는 지금

static Animal createAnimal(){ Animal a = null; //generate a randomly return a; } 

:

class Frog extends Animal{ void move(){ hop();} } class Snake extends Animal{ void move(){crawl();} } 

지금 당신은 무작위로 동물의 종류를 생성 어딘가에 동물 관리자가 A를 통해 참조를 보유하더라도 B에 특정한 메소드? 당신은 단지 배우려고하거나 당신이 정말로 어떤 이유로 그 기능을 필요로합니까? –

답변

2

아니요, 불가능합니다. 객체 aObjectbObject 모두 캐스팅을 사용하지 않고 A에 정의 된 메소드 만 호출 할 수 있습니다.

bObjectB으로 정의하면 코드를 그대로 사용하기 때문에 A의 메소드 및 멤버 만 사용할 수 있습니다.

+0

@Anthony Pegram 감사합니다. 그런 경우 다형성의 이점은 무엇입니까? – nik7

+0

@ynwa, 의견은 다형성의 장점에 대해 이야기하기에 충분한 공간이 아닙니다. 하지만 일반적으로 말하자면 (API를 통해) 수퍼 클래스에 정의 된 모든 기능에 대해 하위 클래스에 대한 동작을 특수화하거나 재정의 할 수 있다고 생각하십시오. API에 추가하는 것은 그 이상입니다. 단순한 예제. 동물들은 소음을냅니다. 그러나, 고양이 야옹. 개들이 짖다. 동물 슈퍼 클래스에'void speak()'이 정의되어 있다면, 당신은 당신의 서브 클래스에서 특정한 올바른 행동을 만들 수 있습니다. –

+0

내 이해에서, 수퍼 클래스 메소드가 서브 클래스에 의해 오버라이드 된 경우, 메소드 호출은 오브젝트에있는 인스턴스에 기초하여 수행 될 것인가? A가 speak() 메소드를 갖고 B가 override()가 speak()와 같은 경우. A bObject = 새로운 B(); bObject.speak()는 재정의 된 메서드를 호출하고 A aObject = new A(); aObject.speak()는 A.에서 메서드를 호출합니다. 맞습니까? – nik7

2

아니요, 이제는 aObject와 bObject가 모두 이제 A 유형입니다.

3

아니, 당신은 확실히 B.

까지 컴파일러에 관한 한, bObject가 선언 된 클래스 A.이며, 때문에 대신 생성자를 사용하여, 당신이 돌아 왔다는 것을 상상해됩니다 bObject 캐스팅 할 필요가 클래스 A를 반환하는 함수에서 bObject ..... 어떻게 컴파일러는 실제로 클래스 B라는 것을 알 수 있습니까?

당신은 따라서 런타임 캐스팅을하거나 컴파일러는

+1

'instanceof' 검사 후에도'B' 멤버 중 한 명에게 접근하고 싶다면 캐스트를해야합니다. –

+0

그래서 타이 캐스팅이 유일한 방법입니까? 좋은 프로그래밍 방식인가요? – nik7

2

아니, 당신은 할 수없는 수준의 B.로 사용하게됩니다 전에 instanceof를 확인해야합니다. 당신이 기꺼이 경우 캐스트를 피할 수있는 유일한 방법은 다음과 같습니다

객체 (변수 선언의 왼쪽에있는 타입)의 선언 된 형태이 방법은 호출 할 수 있는지 결정하기 때문에입니다
B bObject = new B(); 

, 형식이 A이라고 쓰면 A의 메서드 만 호출 할 수 있습니다. 캐스트를 수행하지 않는 한.

1

나는 당신이 다형성 이해할 수 있도록 학습하는 데 사용되는 예를 사용합니다 :

여러 동물로 구성된 게임을 작성합니다. 이 동물의 한 가지 중요한 점은 어떻게 움직이는가입니다. 그런 다음 클래스 정의

class Animal{ 
void move(){} 
} 

를하지만 개구리와 포유 동물은 그들에게 같은 방법으로 이동합니까? 그들은 그렇지 않습니다. 다시 말하면, 생성되는 동물의 유형이 무작위로 이루어지기 때문에 현재 어느 동물이 조작되고 있는지 알 수있는 위치에 있지 않습니다 (따라서 게임의 이익을 위해). 당신이 가지고있는 것은 동물에 대한 참고서입니다. 예 (반성) 유형을 얻을 수 있지만 왜 소동입니까? 그래서 모든 가능한 동물 유형에 대한 동물 클래스를 하위 클래스로 분류하고 이동 동작을 무시합니다.당신은 당신이 자신을 호출 할 필요가 찾을 곳에서 당신을 무엇 상황

Animal a = AnimalManager.createAnimal(); 
a.move(); //it may hop or crawl. it just does not matter how it does it. you dont care whether it is a Frog, a Snake, a Man. but it will move. now thats polymorphism!