2015-12-20 2 views
0

Скажем, у меня есть 5 классов, 1 суперкласс и 4 подкласса. мой суперкласс - это Animal и имеет виды и харатеристику, эти 2 будут унаследованы для моих подклассов.Полиморфизм 1 Суперкласс 4 Подкласс

4 подкласса: Lion, Eagle, Bee и Whale .. (эти 4 подкласса расширяют Animal). Эти подклассы будут иметь метод Voice() и Walk().

Вопрос в том, что мой наставник сказал своему студенту 1, что если эта программа запущена, будет запущено меню, которое показывает, что 4 подкласса/объекты животных. случай 2. после того, как пользователь выберет животное, например: Eagle. Затем он показывает, какой голос и орел орла. case 3. Если пользователь выберет exit, то завершите работу программы.

В этом случае мы будем использовать случай коммутатора правильно? .. Но тогда мой вопрос заключается в том, как я могу назвать эти 4 подкласса из моего суперкласса?

Если я добавляю общедоступную статическую void main внутри каждого подкласса, то эти 4 подкласса становятся основным методом, и я не могу установить или создать его с корпусом коммутатора. или мне нужно создать другой класс, который расширяет эти 4 подкласса и вызывает его?

спасибо, я надеюсь, вы понимаете, что я имею в виду :))

ответ

1

Вы должны получить доступ к методам подклассов через виртуальные вызовы методов (на ссылке типизированного суперкласса). Вы также можете использовать шаблон Factory. Может быть что-то вроде этого:

int choice; 
// read the choice, if exit chosen then exit 

// getAnimal returns the actual animal instance 
// (either a new instance or an existing one from internal registry) 
// can select by switch() inside 
Animal *animal = getAnimal(choice); // or Animal::getAnimal(choice), etc. 

if (animal == null) { 
    System.err.println("Invalid choice"); 
} else { 
    // will call the methods on the actual specific animal retrieved by getAnimal() 
    animal.Voice(); 
    animal.Walk(); 
} 

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

EDIT: Это как метод getAnimal() может выглядеть следующим образом:

Animal * getAnimal(int choice) 
{ 
    switch (choice) 
    { 
    case 1: 
     return new Lion(); 
    case 2: 
     return new Eagle(); 
    // etc. 
    default: 
     // invalid choice 
     return null; 
    } 
} 
+0

Так что мне не нужно создавать 4 подкласса, это то, что вы предлагаете? Но мой наставник дает мне изображение для этой задачи, что есть 4 подкласса, расширяющих Животное. И я должен создать отдельный класс для самого приложения main()? такой пример, который дается shnplr? Спасибо – pramiezequel

+0

Вам необходимо реализовать подклассы (каждый из которых будет соответствующим образом реализовывать методы 'Voice()' и 'Walk()'). И в моем примере, 'getAnimal()' должен получить соответствующий экземпляр в соответствии с выбором. Я отвечу на пример. – axalis

+0

Да, вам лучше быть Е. Масковским, еще раз спасибо .. – pramiezequel

1

В какой-то момент вы должны создать экземпляры животных

Animal a1 = new Lion(); 
Animal a2 = new Eagle(); 
System.out.println(a1.Species()); 
System.out.println(a2.Species()); 

Создать отдельный класс для управления вашей программы содержащие основные

public class MyClass { 
    public static void main(String[] args) { 
    int opt = 1; // TODO - use args 
    switch (opt) { 
     case 1: 
     Lion obj = new Lion(); 
     System.out.println("Voice: " + obj.Voice() + ", Walk: " + obj.Walk(); 
     break; 
     case 2: 
     Eagle obj = new Eagle(); 
     System.out.println("Voice: " + obj.Voice() + ", Walk: " + obj.Walk(); 
     break; 
// etc 
    } 
    } 
} 
+0

Спасибо за ваш ответ :)), где я создаю свои экземпляры животных? внутри моего класса животных? и этот класс MyClass, отдельный класс для управления моей программой, содержащей main()? поэтому у меня есть еще один подкласс, кроме тех, что у меня есть? Спасибо – pramiezequel

+0

Класс приложения ('MyClass' здесь) не должен быть подклассом' Animal'. Это может быть совершенно несвязанный класс (за исключением того, что он будет импортировать и использовать классы животных для обеспечения функциональности). – axalis

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