gpt4 book ai didi

java - 实例化扩展类或其父类(视情况而定)

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:06:42 25 4
gpt4 key购买 nike

假设我在 ProjectA 中有一个名为 Human 的类。它在同一项目的 CreatureBuilder 类中实例化。

现在我想在另一个项目中创建一个名为 Cyborg 的新类,即在 ProjectB 中。 ProjectB 在其导入中有 ProjectA,但 ProjectAProjectB 一无所知。

Cyborg extends Human,并且还必须由 ProjectACreatureBuilder 实例化(因此,Cyborg 位于在 ProjectB 中,我从 ProjectB 调用 CreatureBuilder 来实例化 Cyborg,但是 CreatureBuilder 是位于 ProjectA 以及我的 Human 类中)。

CreatureBuilderProjectA 实例化时,我需要一个逻辑来创建一个 Human,并创建一个 CyborgCreatureBuilderProjectB 实例化时。

我认为可以通过在 ProjectA 中使用 getCreature() 方法创建接口(interface)来实现。此方法将在 ProjectB 中被覆盖以返回新的 Cyborg,然后传递回 ProjectACreatureBuilder。还有其他建议吗?您认为最好的解决方法是什么?我可以改用反射 API 吗?

干杯!

最佳答案

Java 8

CreatureBuilder 可以通过请求 Supplier 将生物的创建委托(delegate)给调用者.

public class CreatureBuilder {
public Creature getCreature(Supplier<Creature> creatureSupplier)
{
//do some unknown things
return creatureSupplier.get();
}
}

ProjectA 的用法

public class ProjectA {
public static void main(String[] args) {
Creature A = new CreatureBuilder().getCreature(Human::new);
}
}

项目 B 的使用

public class ProjectB {
public static void main(String[] args) {
Creature B = new CreatureBuilder().getCreature(Cyborg::new);
}
}

如果不是被迫的话,永远不要使用反射。

Java 7

如果您坚持使用 Java 7,则原理保持不变,只是它更加冗长。

您必须声明并使用您自己的类似供应商的接口(interface)

public interface CreatureSupplier {
Creature get();
}

public class CreatureBuilder {
public Creature getCreature(CreatureSupplier creatureSupplier)
{
//do some things
return creatureSupplier.get();
}
}

用法有点冗长

public class ProjectA {
public static void main(String[] args) {
Creature A = new CreatureBuilder().getCreature(new CreatureSupplier() {
@Override
public Creature get() {
return new Human();
}
});
}
}

public class ProjectB {
public static void main(String[] args) {
Creature B = new CreatureBuilder().getCreature(new CreatureSupplier() {
@Override
public Creature get() {
return new Cyborg();
}
});
}
}

然后...就是这样,您的行为与 Java 8 中的行为相同。

关于java - 实例化扩展类或其父类(视情况而定),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35627246/

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