WedX - журнал о программировании и компьютерных науках

ArrayList SuperClass, содержащий унаследованные классы

Допустим, у меня есть класс A, в котором есть несколько методов. Затем у меня есть класс B, который расширяет A, но имеет дополнительную переменную. Теперь я хочу иметь ArrayList как A, так и B в другом классе, чтобы, когда я перебираю список, например, с помощью метода .getName(), я получал имя обоих классов? Создать ArrayList<A> и добавить к нему экземпляры A и B, или создать ArrayList<Object>? В случае ArrayList<Objects>, как мне вызвать .getName() для разных объектов?


  • Если я правильно понимаю ваше намерение, вы должны иметь возможность использовать ArrayList<A>, поскольку B является подклассом A. Если оба класса имеют метод getName() (B унаследует метод от A, но вы также можете переопределить его), вам просто нужен цикл для повторения вашего ArrayList и вызова метода getName() для каждого объекта в ArrayList. 02.12.2015

Ответы:


1

Вы должны создать ArrayList с параметром типа, установленным на A. B наследует все свойства и методы A, что означает, что вы можете получить к ним доступ в B точно так же, как вы обращаетесь к ним в A. Однако если вы хотите получить доступ к свойство в B, которого нет в A, вам придется его разыграть. Например,

for (A p: aList) {
  p.methodFromA();
  if (p instanceof B) {
     B q = (B) p;
     q.methodOnlyBHas();
     // or
     ((B)p).methodOnlyBHas();
  }
}

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

02.12.2015
  • Но что, если я хочу распечатать объект, т. е. что у A есть некоторые переменные с именем name, size, color, а у B есть то же самое, но также есть переменная `weight , how do I get all of the variables from A and all from B? Like: For(A p: aList){ print(p) }`, но я также хочу напечатать объект типа B в ArrayList<A> ? Если есть смысл.. 02.12.2015
  • Я обновил ответ, чтобы добавить пример кода, надеюсь, это поможет 02.12.2015
  • Не за что, рад помочь :) 02.12.2015

  • 2

    ArrayList<A> будет работать как для A, так и для B, нет необходимости в большем обобщении, т.е. Object.

    Способ вызова getName() зависит от того, где определено getName(). Если он находится в A, вы можете вызвать его во всех объектах в ArrayList, но если метод находится только в B, вам, возможно, придется проверить instanceof B, а затем вызвать метод.

    02.12.2015
    Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

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

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]