0

首先,我想为我的语法道歉,因为英语不是我的第一语言,通常我会犯语法错误......

有一些问题总是阻止我编写通用代码:

如何将具有抽象方法的抽象类放在另一个抽象类中?我知道抽象类不能被实例化,但是......没有任何方法可以用通用性来做到这一点吗?

一个例子:我有抽象类Feline,这个类有几个抽象方法。还有另一个类:Cage类,它只能包含一定数量的一种猫科动物物体(比如一笼猫、一笼跳跳虎、一笼狮子等)……但我该怎么做? 我无法在Cage类中实例化Felines ......我如何制作一个猫笼?

另一个例子,我注意到我可以只使用两个排序标准对一组东西进行排序:这个东西会跟在另一个东西之后吗?并且:这个东西会先于另一个东西吗?

所以,每个可排序的东西都必须有两个布尔方法:“goesAfter(stuff): boolean”和“goesBefore(stuff): boolean”,然后,我通过组合/聚合关系把这些东西放在另一个类上,我们称之为LotsOfSortableStuff类,我会放“sort():void”方法,这个方法将使用这个可排序的东西中的gosAfter和gosBefore方法......

有很多东西可以排序:学生(按学位)、孩子(按身高)、姓名(按字母顺序)等...问题是:每当我想收集可排序的东西时,我都有一遍又一遍地键入相同的两种方法,以及排序算法!

我如何在这类问题中应用泛型?

4

2 回答 2

2

多态性允许您将子类的对象存储在定义为保存超类对象的容器中。例如,在您的类中,您可以有一个可以包含子类任何对象的CageList<Feline> felinesFeline

排序:为此,您可以使您的超类实现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);
        }
    }
于 2013-05-18T20:02:43.793 回答
0

对于您的排序问题,您应该考虑使所有需要在列表中聚合然后排序的类实现Comparable接口。这是自定义对象排序的标准,并且Comparable可以对项目列表进行排序,Collections.sort这非常简单。

于 2013-05-18T19:59:25.860 回答