2015-12-25 1 views
4

Я начинаю на Java, пытаясь написать систему партийных квестов для игры, которую я сейчас пишу, и у меня есть несколько вопросов, которые я хотел бы быть ответил. Я уже обошел и спросил других людей, но они не знакомы на Java.Вопросы о классах, распространяющихся от базового класса (Java)

В прошлом я пытался создать кучу классов и получить доступ к ним с помощью нескольких методов получения. Я обнаружил, что невероятно утомительно писать и думать, что я могу объединить их в абстрактном классе/реализованном классе. Таким образом, код выглядел более как это ...

DynastyPQInterface pq = new CustomPQ // or .... 
DynastyPQInterface pq = new OtherCustomPQ 

Конечно, это представляло трудности, такие как возможность использовать только реализованные методы. Это не позволило мне получить доступ к эксклюзивным методам класса, которые я, возможно, захочу использовать позже.

В конечном счете, я хочу, чтобы иметь возможность использовать один метод get, чтобы возвращать любой из этих производных классов, но при этом сохраняя возможность просто повсеместно использовать метод get для вызова методов, которые они имеют вместе, такие как выполнить, создать, конец, одновременно позволяя мне специально использовать их эксклюзивные методы. Есть ли способ сделать это, или это невозможно?

Если это все еще не ясно ...

код у меня написать теперь базовый класс, который распространяется на другие классы в порядке ...

DynastyPQ (base) -> methods include (run(), execute(), end()) 
CustomAPQ (inherited from DynastyPQ) -> (has exclusive methods like getPoints()) 
CustomBPQ (inherited from DynastyPQ) -> (has exclusive methods like revivePlayer()) 

Я хочу написать метод get, чтобы избавиться от множества. То, что я прямо сейчас ...

DynastyPQ dynastyPQ;  

DynastyPQ getPQ() { 
    return dynastyPQ; 
} 

void setPQ(DynastyPQ pq) { 
    dynastyPQ = pq; 
} 

Делать это ...

DynastyPQ pq = new CarnivalPQ(); 

я могу получить доступ только методы DynastyPQ, а не методы Карнавала.

Есть ли способ доступа к эксклюзивным методам, в то время как универсально может выполнять четыре базовые функции независимо от типа класса, или я пропустил что-то раньше?

tl; dr -> Мне нужен один метод get, который универсально возвращает все классы, которые наследуются от класса X; однако я хочу иметь доступ к эксклюзивным методам каждого класса.

+0

'CarnivalPQ pq = new CarnivalPQ();'? Это то, что вы ищете? –

+0

К сожалению, нет, потому что тогда мой метод getPQ() должен был бы вернуть именно CarnivalPQ; однако проблема, с которой я сталкиваюсь, заключается в том, что если я создаю кучу других классов, которые наследуются от базового или абстрактного класса, я хочу иметь доступ к ним повсеместно, а не getMethod для каждого из них. –

+0

Что это за метод getPQ()? Что оно делает? Какая особенность у этого нового CarnivalPQ() отсутствует? Отправьте код. –

ответ

0

Вы, вероятно, может просто привести объект производного класса:

DynastyPQ pq = new CustomAPQ(); 
((CustomAPQ)pq).customAPQmethod(); 

Если вы не знаете, что такое динамический тип (тип, который Вы использовали после нового оператора), вы можете использовать InstanceOf ключевое слово:

DynastyPQ pq = getPQ(); 
if (pq instanceof CustomAPQ) { 
    CustomAPQ a = (CustomAPQ)pq; 
    a.customAPQmethod(); 
} else if (pq instanceof CustomBPQ) { 
    CustomBPQ b = (CustomBPQ)pq; 
    b.customBPQmethod(); 
} else { 
    // Neither a CustomAPQ nor a CustomBPQ. 
} 

Если вы не хотите, чтобы сделать это, вы можете использовать полиморфизм:

class DynastyPQ { 
    final void run() { 
     // code. 
    } 
    final void execute() { 
     // code. 
    } 
    final void create() { 
     // code. 
    } 

    void specific1() {} 
    void specific2() {} 
} 

class CustomAPQ extends DynastyPQ { 
    @Override 
    void specific1() { 
     // do stuff specific to CustomAPQ. 
    } 
    @Override 
    void specific2() { 
     // do stuff specific to CustomAPQ. 
    } 
} 

class CustomBPQ extends DynastyPQ { 
    @Override 
    void specific1() { 
     // do stuff specific to CustomBPQ. 
    } 
    @Override 
    void specific2() { 
     // do stuff specific to CustomBPQ. 
    } 
} 

Теперь вы можете сделать:

DynastyPQ pq = new CustomAPQ(); 
pq.specific1(); 

Вызываемый метод будет CustomAPQ::specific1().Если specific1() не был объявлен в CustomAPQ, тогда он просто ничего не сделает.

+0

Это позволяет мне использовать один метод для возврата PQ; однако, в конце концов, это не сильно отличается от использования кучи getMethods в конце. –

+0

Если статическим типом вашего объекта является DynastyPQ, вы можете вызывать только методы, объявленные в DynastyPQ. Если вы не хотите его реализовывать, вы можете сделать его абстрактным и задать свой класс как абстрактный. Я могу написать пример, если вы хотите. –

+0

Да, пожалуйста. Я хотел бы увидеть пример. –

0

Кроме @CelineNOEL, это невозможно. Поскольку вы объявили класс типа DynastyPQ, вы можете вызывать только методы, определенные внутри этого класса. В тот момент, когда вы хотите вызвать определенный метод, а не общий, вы знаете, из какого класса он есть, и вы можете использовать кастинг для вызова этого конкретного метода.

((CustomAPQ)pq).customAPQmethod() 

Общие методы, которые вы используете в коде, когда вы не знаете, какой класс должен выполнить тот же мир кода (или вы хотите, чтобы выполнить это иначе, если вы переопределить методы акций в каждом подклассе), и вы делегируете его для разрешения во время выполнения. Поэтому передумайте свой дизайн и методы базового класса, которые нужно называть динамически. Все остальные методы, которые вы уверены, специфичны для одного класса, помещенного только в этот класс. Таким образом, ваш код будет более чистым, и вы не будете путать вещи, которые должны быть разделены.

 Смежные вопросы

  • Нет связанных вопросов^_^