首先,我想为我的语法道歉,因为英语不是我的母语,通常我会犯语法错误......
有一些问题总是阻止我编写通用代码:
如何将具有抽象方法的抽象类放入另一个抽象类中?我知道抽象类无法实例化,但是...没有任何方法可以通用性实现它吗?
一个例子:我有一个抽象类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/