Переменная Multi Type Java Base Object - PullRequest
       19

Переменная Multi Type Java Base Object

2 голосов
/ 22 августа 2010

Я уверен, что это невероятно часто встречается с ООП-центром, как и Java.В Java есть способ сделать переменную базового типа, которая принимает все унаследованные подтипы?Например, если у меня есть;

class Mammal {...}
class Dog extends Mammal {...}
class Cat extends Mammal {...}

class ABC {
    private Mammal x;

    ABC() {
        this.x = new Dog();
        -or-
        this.x = new Cat();
    }
}

Мне нужна переменная, чтобы можно было принимать любую расширенную версию, но не в конкретном расширенном виде.

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

Любые другие идеи или способ получить переменную типа "базовый класс"?


Хорошо, так как я знаю, что использование полиморфной типизации утки isn 'отличная идея в Java, но так как я не думаю, что могу избежать этого.Является ли единственным способом динамического использования методов подкласса для повторного присвоения приведенной версии переменной, т. Е. Я получаю ошибку с этим;

Mammal x;
x = new Dog();
System.out.println(x.getClass());
x.breath();
if (x instanceof Dog) {
  x.bark();
} else if (x instanceof Cat) {
  x.meow();
}

Символ произнесения не найден, однако это работает;

Mammal x;
x = new Dog();
System.out.println(x.getClass());
x.breath();
if (x instanceof Dog) {
  Dog d = (Dog) x;
  d.bark();
} else if (x instanceof Cat) {
  Cat c = (Cat) x;
  c.meow();
}

Это последний единственный способ сделать это?

1 Ответ

1 голос
/ 22 августа 2010

Если у вас есть следующее:

class Mammal {...}
class Dog extends Mammal {...}
class Cat extends Mammal {...}

Тогда Dog является подтипом Mammal. Cat также является подтипом Mammal. Этот тип полиморфизма действительно позволяет вам делать следующее:

Mammal x;
x = new Dog(); // fine!
x = new Cat(); // also fine!

Если на самом деле позже есть следующее:

class Platypus extends Mammal {...} // yes it's true!

Тогда вы также можете сделать:

x = new Platypus(); // fine!

Это отношение полиморфных подтипов является одним из основных принципов объектно-ориентированного программирования.

Смотри также


Вкл. instanceof оператор сравнения типов

Предположим, у нас есть следующее:

class Mammal { void lactate(); }
class Dog extends Mammal { void bark(); }
class Cat extends Mammal { void meow(); }

Затем вы можете использовать instanceof оператор сравнения типов ( §15.20.2 ), чтобы сделать что-то вроде этого:

Mammal x = ...;

if (x instanceof Dog) {
   Dog d = (Dog) x;
   d.bark();
} else if (x instanceof Cat) {
   Cat c = (Cat) x;
   c.meow();
}
if (x != null) {
   x.lactate();
}

Есть также способы сделать это без if-else; это просто дано в качестве простого примера.

Обратите внимание, что при соответствующем дизайне вы сможете избежать некоторых из этих видов логики дифференциации подтипов. Например, если Mammal имеет метод makeSomeNoise(), вы можете просто вызвать x.makeSomeNoise().

Похожие вопросы


Отражение

Если вам приходится иметь дело с новыми типами, не известными во время компиляции, тогда вы можете прибегнуть к рефлексии. Обратите внимание, что для общего применения почти всегда есть намного лучшие альтернативы, чем рефлексия.

Смотри также

...