gpt4 book ai didi

java - 继承时代码重复

转载 作者:行者123 更新时间:2023-12-01 07:24:11 25 4
gpt4 key购买 nike

我正在从一本名为“Thinking in Java”的书中学习一些 Java,并且我想尝试一些继承/多态性。但我遇到了一些我不太喜欢的代码。就这样...

class Person{
private int hp, attack, speed;
public status() { System.out.println("HP : " + hp + ", ATT : " + attack + ", SPD : " + speed); }
public punch(){ System.out.println( " punches"); }
public getPunched(){ hp -= 5; }
/* plus standard getters/setters to save up your time */
}
class Bob extends Person{
private String name = "Bob";
public Bob(){ setHp(100); setAttack(25); setSpeed(15); }
public punch(){ System.out.println(name); super.punch(); }
public getPunched(){ System.out.println(name + " gets punched"); super.getPunched(); }
}
class Jake extends Person{
private String name = "Jake";
public Jake(){ setHp(120); setAttack(30); setSpeed(10); }
public punch(){ System.out.println(name); super.punch(); }
public getPunched(){ System.out.println(name + " gets punched"); super.getPunched(); }
}

现在这一切都按原样运行(可能有一些拼写错误,我的版本有点长,所以我在这里重新输入了较短的版本)。

我想知道的是,有没有办法让 Bob 和 Jake 类中的punch() 和 getPunched() 方法不重复?更具体地说,我可以将它们放在 Person 类中,同时保留一个人仍会打印出其子名称(“Bob/Jakepunches”)的函数,还是必须将其放在其他地方的静态函数中?如果我必须将它放入一个函数中,它必须是什么样子,因为我还使用保留命令“super”。

我知道这段代码看起来非常琐碎且无用,对此感到抱歉,但它的目的是这样,所以我可以在编写代码时真正看到我在做什么。

谢谢! :)

编辑:在写这篇文章时,我意识到我可以在父类“Person”中创建一个 protected 字符串名称,并通过 setter 覆盖每个子构造函数中的变量,但是 我仍然感兴趣是否可以寻址到子变量,以及如何做到这一点。

最佳答案

我会告诉你为什么我不喜欢该代码。

基本上,BobJake 不应该是类。它们应该是实例。他们不代表类(Class),他们应该是个人。当然,您可以说类 Bob 代表世界上所有名字为 Bob 的人,但这不是一个现实世界的用例,甚至不是一个非常有启发性的用例。为什么所有鲍勃都应该具有相同的生命值、速度等?

一旦你意识到这一点,就很清楚为什么代码会重复 - 由于这种糟糕的设计,你正在编写一些应该对所有个人或至少对某些个人(这将是 的子类)通用的东西Person) 一次又一次地为每个人。这违背了面向对象编程和一般编程的目的。

因此,请考虑个人的姓名。所有的人都有一个名字。所以这确实应该是 Person 类中的一个字段。它应该像所有其他东西一样有一个 getter 和一个 setter。

使 Bob 与 Jake 不同的东西应该作为参数传递给构造函数。

如果您想要某些人共有的行为,而其他人则不然,那么它可能应该在 Person 的单个子类中定义。例如,PersonWithAnnouncements:

class PersonWithAnnouncements extends Person {

public PersonWithAnnouncements( String name, int hp, int attack, int speed ) {
super( name );
setHp( hp );
setAttack( attack );
setSpeed( speed );
}
public getPunched() {
System.out.println( this.getName() + " gets punched." );
super.getPunched();
}

public punch() {
System.out.println( this.getName() + " punches." );
super.punch();
}
}

然后您可以创建个人 - 实例 - 像这样:

bob = new PersonWithAnnouncements( "Bob", 100, 25, 15 );
jake = new PersonWithAnnouncements( "Jake", 120, 30, 10 );

这是对世界的更好的表述 - 每个人都有自己的生命值、速度和名字。行为是类(Class)问题。如果它属于“自己的类”的个体 - 例如 ChuckNorris 类 - 那么它的行为并不意味着在多个类中重复。而且您仍然需要在该类中创建一个个体。

关于java - 继承时代码重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28285873/

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