java - 面向对象编程和Java : how to generalize from an abstract class?

标签 java oop generics abstract-class

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

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

如何将具有抽象方法的抽象类放入另一个抽象类中?我知道抽象类无法实例化,但是...没有任何方法可以通用性实现它吗?

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

另一个例子,我注意到我可以仅使用两个排序标准对一组内容进行排序:这个内容是否在另一个内容之后?并且:这个东西在另一个东西之前吗?

因此,每个可排序的东西都必须有两个 boolean 方法:“goesAfter(stuff): boolean”和“goesBefore(stuff): boolean”,然后,我通过组合/聚合关系将这些东西放在另一个类上,让我们调用它是LotsOfSortableStuff类,我会放置“sort():void”方法,该方法将使用此可排序内容中的gosAfter和gosBefore方法...

有很多东西可以排序:学生(按学位)、 child (按高度)、姓名(按字母顺序)等...问题是:每当我想要收集可排序的东西时,我必须一遍又一遍地输入相同的两种方法和排序算法!

如何在此类问题中应用通用性?

最佳答案

多态允许您将子类的对象存储在定义为保存父类(super class)对象的容器中。例如在你的类(class) Cage你可以有一个List<Feline> felines可以包含 Feline子类任何对象

排序:为此,您可以让您的父类(super class)实现 Comparator接口(interface),它需要具体的子类来实现 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);
        }
    }

关于java - 面向对象编程和Java : how to generalize from an abstract class?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16628366/

相关文章:

oop - 何时将方法声明为私有(private)

java - 通用方法 - "private <T> boolean (T[], T[])"

c# - 通用扩展方法中的嵌套 Func<T, object>

由于 Eclipse IDE 导致的 Java 通用问题

java - Springboot中加载API定义失败

java - 为什么我的所有 Kafka 消息都在 Storm 中重播?

c# - 迭代器中的副作用被认为是有害的?

java - 如何填充接口(interface)列表?

java - 当我部署在 Websphere 服务器中时,如何对应用程序进行 Rest API 调用?

java - 使用 Lambda 解引用 Int 值