2009-11-12 4 views
2

Извините, если мой вопрос звучит странно, я попытаюсь объяснить. У меня 4 класса: Карактер, Карактерс, Орк, Человек. Орк и Человек расширяют Карактер. Karakters - это ArrayList с Карактером.Как использовать метод из класса в другом классе без расширения

У меня есть метод как для Орка, так и для человека, который называется: public String getRace(). Теперь я хочу использовать этот метод в Karakters? !! Когда я пытаюсь это сделать, это терпит неудачу, потому что Орк и Человек расширяют Карактера, а не Карактеры! Есть ли способ сделать это? Я слышал что-то о том, чтобы что-то абстрактное: P

Благодарности

+2

Это может показаться мелочным - но включение «LOL» в вопрос о переполнении стека - это не очень хорошая идея. Чем больше времени вы берете, чтобы сформулировать свой вопрос точно и продуманно, тем лучше качество ответов, которое вы, скорее всего, получите. –

+0

спасибо dtsazza, я буду держать это в виду :) – Loolooii

ответ

5

Объявите метод getRace() в Karakter (обратите внимание, что английское правописание «Персонаж», но это ни здесь, ни там).

С Karakters известно только, что он имеет дело с объектами типа Karakter, он не может знать, что обе реализации имеют метод getRace. Объявление метода в базовом классе решает эту проблему.

Он должен выглядеть следующим образом:

public abstract String getRace(); 

И Karakter класс также должны быть сделаны abstract.

+0

Он, вероятно, не использует персонаж из-за 'java.lang.Character'. –

+0

Спасибо, mmyers. Это мой ответ :) – Loolooii

+0

@ Аарон: Правда, я забыл, что это было в 'java.lang'. –

1

Для вызова getRace(), определенный в Орка или Человека вам нужен объект Орка или Человека или одного из его производных классов (предполагается, что метод не является частным в база). Конечно, если getRace() является public static, вы можете использовать имя класса, чтобы вызывать его из любого места.

3

Что вы ожидаете, когда будете звонить по телефону Karakters.getRace()?

С Karakters является ArrayList, то почему бы просто не использовать метод getRace(int position), чтобы вы могли найти гонку интересующего человека.

Я не вижу, как получить расу массива имеет смысл.

+0

Я не ожидаю, что что-нибудь случится, и я не называю Karakters.getRace(). Я хочу сделать это: arrayOfKarakters.get (i) .getRace(). Equals («Человек») или Орк! Спасибо в любом случае :) – Loolooii

2

Это не имеет смысла. Если у вас есть ArrayList, то вы можете позвонить getRace() по каждому элементу:

class Karakters { 
    ArrayList<Karakter> kars = new ArrayList<Karakter>(); 
    public String getRace() { 
     for (Karakter k: kars) { 
      ... uh ... which one to return? 
     } 
     return null; // List is empty 
    } 
} 
+0

Я хочу посмотреть каждый Karakter в ArrayList и посмотреть, не будет ли arrayL.get (i) .getRace(). Equals («Человек») или «Орк» – Loolooii

1

Вы можете проверить на выполнения Каков конкретный тип Karakter и приведение в соответствующий подтип.

for(Karakter k : karakters) { 
    if (k instanceof Orc) { 
     ((Ork)k).getRace(); 
    } else if (k instanceof Human) { 
     ((Human)k).getRace(); 
    } 
} 

Кроме того, похоже, что вы могли бы подтолкнуть вверх метод getRace() в Karakter, если это имеет смысл для Karakter иметь getRace().

class/interface Karakter { 
    abstract String getRace(); 
} 

Если это не имеет смысла для Karakter иметь getRace(), например, если есть другой тип Alien extends Karakter, который не имеет getRace() вы могли аннотация с дополнительным интерфейсом:

public interface IRacer { 
    abstract String getRace(); 
} 

public class Human extends Karakter implements IRacer { ... } 
public class Orc extends Karakter implements IRacer { ... } 

Таким образом, вы можете сделать:

for(Karakter k : karakters) { 
    if (k instanceof IRacer) { 
     ((IRacer)k).getRace(); 
    } 
} 

Кроме того, это выглядит как ваш class Karakters Exten ds ArrayList. Не. Благодарите композицию над наследованием и всегда используйте общую версию ArrayList<Karakter>.

+0

нет, Karakters не расширяет ArrayList и меня 'm using ArrayList :) спасибо. – Loolooii

1

Вы можете вызвать метод на объекте, который реализует этот метод, если он доступен из вашего текущего класса. В частности, поскольку метод getRace является общедоступным, любой класс может вызвать его, если у него есть соответствующий экземпляр Orc или Human, чтобы позвонить ему.

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

Одним из решений является добавление метода getRace к классу Karakter. Если для этого нет смысла возвращать значение в суперклассе, то вы можете сделать суперкласс аннотация (что означает, что вы не можете построить его экземпляр напрямую, вы можете создать только один из его подклассов) и объявить метод абстрактного в Karakter тоже:

public abstract class Karakter 
{ 
    /* 
    ... 
    ... Same as before 
    ... 
    */ 

    public abstract String getRace(); 
} 

Это заставляет подклассы иметь реализацию getRace (который не является проблемой здесь, так как они делают в любом случае) и означает, что Karakters теперь может быть уверен, что что независимо от того, какой объект Karakter он имеет, есть метод getRace() для вызова.

Это всего лишь один подход к решению, основанный на том, что я понимаю, ваше намерение быть. Но основная проблема заключается в том, что класс Karakter не определяет getRace, и поэтому метод не может называться напрямую по ссылкам этого типа.

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