gpt4 book ai didi

java - 使用继承(使用抽象类)在自定义框架内为子类提供一小部分方法的更优雅的方式?

转载 作者:行者123 更新时间:2023-11-30 02:21:19 27 4
gpt4 key购买 nike

我有以下示例性设置:

Class diagram of setup

不幸的是,这行不通,而且我找不到合适的、优雅的解决方法。这个想法是,当添加新的动物类别(例如鸟类)时,我只需创建一个类似于 TemplateMammals 的 TemplateBird。创建新的 Bird 类时,我只能访问通过 BirdStuff 类定义的正确方法。

我可以在动物类别模板中创建非抽象方法(例如

public MammalStuff getAnimalStuff{ return new MammalStuff()}

for TemplateMammals),但我不喜欢这样,因为我想创建一个框架,因此想强制用户实现这样的方法。

您有什么优雅的改进想法吗?或者完全不同的想法?

谢谢!

最佳答案

使用泛型怎么样?

动物素材

第一步,我们将定义内容,并且Stuff必须从基本接口(interface)抽象类派生:

public interface AnimalStuff{
public void doAnimal();
}

然后您将根据需要定义层次结构。我混合了抽象类和接口(interface),但您可以执行完整的抽象类或完整的接口(interface),直到实现的类:

public abstract class MammalStuff implements AnimalStuff{
// no need to override unless there are mammal specific stuff
public void doAnimal(){...}
}

public abstract class BirdStuff implements AnimalStuff{
// example of bird specific
@Override
public void doAnimal(){
System.out.println("I believe I can fly!!!");
}
}

如果我以鸟为榜样:

public class EagleStuff extends BirdStuff{

@Override
public void doAnimal(){
super.doAnimal();
System.out.println("But I also eat preys!!!");
}

}

动物类别

然后您可以创建您的动物层次结构:

public abstract class TemplateAnimal<S extends AnimalStuff> {

public abstract S getAnimalStuff();

}

使用您定义的层次结构。泛型定义在这里有效因为 MammalStuffBirdStuff 扩展(或实现)AnimalStuff

public abstract class TemplateMammal<S extends MammalStuff> extends TemplateAnimal<S>{

// no overriding here
// public abstract S getAnimalStuff();
}

public abstract class TemplateBird<S extends BirdStuff> extends TemplateAnimal<S>{

// no overriding here
// public abstract S getAnimalStuff();
}

然后,你就会拥有你的 Eagle:

public class Eagle extends TemplateBird<EagleStuff>{

@Override
public EagleStuff getAnimalStuff(){
// return ...
}

}

Eagle 类中,您有带有此签名 public AnimalStuff getAnimalStuff()getAnimalStuff(),它是非法的,因为泛型要求返回 S 类型,而不是 AnimalStuff

关于java - 使用继承(使用抽象类)在自定义框架内为子类提供一小部分方法的更优雅的方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46746928/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com