2013-05-18 6 views
0

первую очередь, я хотел бы извиниться о моей грамматике, так как английский не мой первый язык, как правило, я делаю грамматические ошибки ...OOP & Java: как обобщить из абстрактного класса?

Существует некоторая проблема, которая всегда мешает мне сделать общий код:

Как поместить абстрактный класс с абстрактными методами внутри другого абстрактного класса? Я знаю, что абстрактные классы не могут быть созданы, но ... нет ли способа сделать это с помощью универсальности?

один пример: У меня есть абстрактный класс Feline, этот класс имеет несколько абстрактных методов. Существует еще один класс: Cage класс, который может содержать только определенное количество Feline объектов (скажем, клетка кошек, клетка тигров, клетка львов и т. Д.) ... но как я это делаю? Я не могу создать экземпляр Felines внутри Кейдж класс ... И как я могу сделать клетку кошек?

Другой пример, я заметил, что могу сортировать коллекцию материалов, используя только два критерия сортировки: этот материал идет после этого другого материала? и: делает ли это материал перед этим другим?

Итак, каждый сортируемый материал должен иметь два булевых метода: «goAfter (stuff): boolean» и «goesBefore (stuff): boolean», то я помещаю этот материал в другой класс через отношение состава/агрегирования, назовите его классом LotsOfSortableStuff, и я бы поместил метод sort(): void, этот метод будет использовать методы goAfter и goBefore из этого сортируемого материала ...

Есть много вещей, которые можно сортировать: ученики (по степени), Childs (по высоте), имена (по алфабетическому порядку) и т. д. Проблема заключается в том, что всякий раз, когда я хочу создать коллекцию сортируемых материалов, мне приходится вводить текст с использованием одного и того же двух методов, и сортировочный алгоритм!

Как применить типичность в таких проблемах?

ответ

2

полиморфизм позволяет хранить объекты в подклассе в контейнерах, которые определены для хранения суперкласса объектов. Например, в классе Cage вы можете иметь List<Feline> felines, который может содержать любой объект в подкласса из Feline

Сортировка: Для этого вы можете сделать ваши суперкласс реализуют интерфейс Comparator, который требует конкретных подклассов внедрить метод compareTo. Например, если вы хотите отсортировать Cage выше по весу кошек.

Вот пример того, что это может выглядеть следующим образом:

import java.util.List; 
    import java.util.ArrayList; 
    import java.util.Collections; 

    public abstract class Feline implements Comparable 
    { 
     protected double weight; 

     protected abstract void whoAmI(); 

     public void compareTo(Feline other){ 
      new Double(this.weight).compareTo(new Double(other.weight)); 
     } 

     public static void main(String[] args){ 
      Cage c = new Cage(); 

      Feline l = new Lion(400.0); 
      Feline t = new Tiger(555.0); 

      c.addFeline(l); 
      c.addFeline(t); 

      for(Feline f : c.getCage()){ 
      f.whoAmI(); 
      } 
     } 
    } 

    class Tiger extends Feline 
    { 
     public Tiger(double weight){ 
      super(weight); 
     }  

     protected void whoAmI() { 
      System.out.println("I'm a Tiger"); 
     } 
    } 

    class Lion extends Feline 
    { 
     public Lion(double weight){ 
      super(weight); 
     } 

     protected void whoAmI() { 
      System.out.println("I'm a Lion"); 
     } 
    } 

    class Cage 
    { 
     private List<Feline> felines; 

     public Cage(){ 
      this.felines = new ArrayList<>(); 
     } 

     public void addFeline(Feline f){ 
      this.felines.add(f); 
     } 

     public List<Feline> getCage(){ 
      return this.felines; 
     } 

     public void sort(){ 
      Collections.sort(this.felines); 
     } 
    } 
+0

спасибо! это помогло много ... но, как класс ** Список ** не умеет хранить ** Felines **? – Bengalaa

+0

@ RuthGarcía Определенный интерфейс 'List' - это Java, уже настроенный для обработки * generics *. Таким образом, программисты Java могут создавать 'List' любого типа, даже те, которые они создают сами. –

+0

Как и примечание, ваша декларация для 'Feline' должна быть' public abstract class Feline реализует Comparable ' – cmbaxter

0

Для вашей проблемы с сортировкой вы должны рассмотреть возможность создания всех ваших классов, которые должны быть объединены в списки, а затем отсортированы с использованием интерфейса Comparable. Это стандарт для сортировки пользовательских объектов, а списки из Comparable элементов можно сортировать с помощью Collections.sort, что довольно просто.

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