2013-04-30 2 views
1

기본적으로 나는 내가 원하는 것을 기반으로 이것을 올바르게 수행하는 것이 가장 좋습니다.가상 함수로 추상 함수를 대체 하시겠습니까?

Fire()와 같은 메소드가 포함되어 있기 때문에 abstract 클래스 인 무기 클래스가 있습니다 (레이저 대 총알).

그러나 일단 무기 클래스에서 상속받은 실제 탄도 무기 클래스에 도달합니다.

대부분이 똑같은 발사를합니다. 그들은 발사체를 스폰하고 탄약 수를 낮추고 재 장전 타이머가 0이 될 때까지 기다렸다가 다시 발사 할 수 있습니다.

탱크 총이거나 권총 또는 포탑 또는 포병 이건간에 변경 사항 이상으로 유지됩니다. 가상 클래스처럼 보인다

는 (어뢰 발사기, 그것은 수정 될 필요가 제기하고 그래서 추상적/비 가상 수없는 화재 해치 도어를 낮추기 위해 특별한 구현을해야 할 수도 있습니다)

그러나 기본적으로 내가 갖고 싶어

추상적 인 무기 급 화재() 메소드

가상 탄도 무기는 상속 무기 화재() 메소드

하지만 추상 메소드를 오버라이드 (override) 할 수 있다는 것 나던 그것은 그것 가상 하나. 내가

을 weapon.fire 할 수 있도록하고 싶습니다하고 ballstic 무기로 가서하지 않는 한,이 구현을 사용하기 때문에

나는 비록 완전히 새로운 방법을 원하는 생각하지 않는다 특정 탄도 무기가 일반적인 방법보다 우선합니다.

+1

후 관련 코드는, 그것을 설명하지 않습니다. –

+0

@EvanTrimboli Best comment 이번 주에 보았습니다. –

+0

나는 당신이 뭔가를 오해하고 있다고 생각합니다. 추상 메소드는 가상 메소드입니다. 오버라이드 메소드는 가상 메소드입니다. 추상적 인 메소드를 오버라이드 (override)하면 여전히 가상입니다. 어떻게 그럴 수 없습니까? –

답변

1

초록은 가상 클래스가 재정의 될 수 있음을 나타내는 자식 클래스에서 재정의되어야 함을 의미합니다. 추상적 인 클래스에서 가상 메소드를 가질 수 있습니다. 당신은 계약 등의 형태로 결합함으로써 인터페이스를 사용하여 문제를 해결할 수 있습니다 :

Ifireable 
0

당신이 그런 식으로 할 수있는 일 수 있습니다

abstract class Weapon 
{ 
    public abstract void Fire(); 
} 

class BallisticWeapon 
{ 
    virtual public void Fire() 
    { 
     // Ballistic fire 
    } 
} 

// Weapon need ballistic fire 
class WeaponA : BallisticWeapon 
{ 
} 

// Weapon don't need ballistic fire 
class WeaponB : Weapon 
{ 
    // Implement fire 
    public void Fire() 
    { 

    } 
} 
관련 문제