gpt4 book ai didi

oop - 从基类继承许多类是不好的 OOP 实践吗?

转载 作者:行者123 更新时间:2023-12-04 20:14:25 28 4
gpt4 key购买 nike

我是这个网站的新手,所以如果我在发布问题时做错了什么,请告诉我,以便我下次修复。

我很好奇从单个基类继承多个类是否是糟糕的 OOP 实践。这可能不太合理,所以我要详细说明一下。

例如,假设您正在设计一款游戏,您可能会遇到几种不同的怪物。我会采取的方法是只为一般的怪物对象创建一个基本抽象类,然后使用新类从基类中继承所有特定类型的怪物。

我的一位导师告诉我,在这种情况下你不应该依赖继承,因为怪物的数量会继续增长,类的数量会增加到一个很难跟踪所有的点它们中的一个,因此你将不得不在未来添加的每个新类中重新编译程序。

我不明白为什么(或者即使)这是一件坏事。如果有人可以帮助我了解我的教授的来源,我们将不胜感激。

谢谢!

最佳答案

如果怪物非常相似,唯一的区别是(例如)它们的名字、它们造成的伤害程度、它们的颜色等等,那么这些差异可以反射(reflect)在一个领域(在值中),可能使子类化变得不必要。

但是,如果您拥有与其他怪物根本不同的怪物,那么就需要非常不同的方法和逻辑,更具体地说,无法体现的差异字段,那么可能需要一个子类SpecialMonster

但同样,即使 SpecialMonster 也可能不需要按个别怪物类型进行子分类,因为它是 字段可能足以区分他们之间。

虽然拥有一百万个特定怪物类型的子类是合法的,但当它可以简单地在新的Monster字段中表达时,您不想处理所有重复代码实例,例如

new Monster("Goob", WakeTime.NOCTURNAL, 35, new Weapon[]{sword, hammer, knittingNeedle});
new Monster("Mister Mxyzptlk", WakeTime.ANYTIME, 71, new Weapon[]{sword, mindMeld, cardboardCutter});

还有一个替代方案,您确实有很多类,但您不会将它们强加给您的用户,并且您不会用它们弄乱您的 API/JavaDoc。如果你的Monster正好是一个抽象类

public abstract class Monster  {
private final String name;
...
public Monster(String name, int default_damage, WakeTime wake_time, Weapon[] weapons) {
this.name = name;
...
}
public String getName() {
return name;
}
...
public abstract int getDamage(int hit_strength);
}

然后你可以拥有一个像这样的 Monster convenient creator:

/**
<P>Convenience functions for creating new monsters of a specific type.</P>
**/
public class NewMonsterOfType {
private NewMonsterOfType() {
throw new IllegalStateException("Do not instantiate.");
}
/**
<P>Creates a new monster that is nocturnal, has 35-default-damage, and whose weapens are: sword, hammer, knittingNeedle.</P>
**/
public static final GOOB = new GoobMonster();
/**
<P>Creates a new monster that can be awake at any time, has 71-default-damage, and whose weapens are: sword, mindMeld, cardboardCutter.</P>
**/
public static final MISTER_MXYZPTLK = new MisterMxyzptlkMonster();
}
class GoobMonster extends Monster {
public GoobMonster() {
super("Goob", WakeTime.NOCTURNAL, 35, new Weapon[]{sword, hammer, knittingNeedle});
}
public int getDamage(int hit_strength) {
return (hit_strength < 70) ? getDefaultDamage() : (getDefaultDamage() * 2);
}
}
class MisterMxyzptlkMonster extends Monster {
public GoobMonster() {
super("Mister Mxyzptlk", WakeTime.ANYTIME, 71, new Weapon[]{sword, mindMeld, cardboardCutter});
}
public int getDamage(int hit_strength) {
return (hit_strength < 160) ? getDefaultDamage() + 10 : (getDefaultDamage() * 3);
}
}

为了让这些私有(private)(实际上是包保护的)类不出现在你的 JavaDoc 中,你需要设置它的 accessprotectedpublic 的内容。

关于oop - 从基类继承许多类是不好的 OOP 实践吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22770087/

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