首先,我不认为Bob 和Jake 应该是单独的类。他们所做的根本没有什么不同之处。在内部它们是相同的,Bob/Jake 应该只是同一类 Person 的实例。
例如,如果我们有 100 个人,除了他们的“统计数据”外,其他人都相同,您是否要创建 100 个单独的班级?如果我们想在运行时创建新人(无论是通过用户输入还是从文件中读取信息)怎么办?你将无法做到。
相反,内部统计信息(名称、攻击等)应该至少在对象初始化时是可配置的。
import java.util.*;
import java.lang.*;
import java.io.*;
class Person
{
protected String _Name;
protected int _Health;
protected int _Attack;
protected int _Speed;
public Person(final String name, final int health, final int attack, final int speed)
{
_Name = name;
_Health = health;
_Attack = attack;
_Speed = speed;
}
public String getName()
{
return _Name;
}
public void status()
{
System.out.println(_Name + ":\nHP : " + _Health + ", ATT : " + _Attack + ", SPD : " + _Speed);
}
public void punch(final Person target)
{
System.out.println(_Name + " punches " + target.getName() + " for " + _Attack);
target.getPunched(_Attack);
}
public void getPunched(int damage)
{
_Health -= damage;
}
}
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
Person bob = new Person("Bob", 100, 25, 15);
Person joe = new Person("Joe", 120, 30, 10);
bob.status();
joe.status();
bob.punch(joe);
joe.punch(bob);
bob.status();
joe.status();
}
}
输出:
Bob:
HP : 100, ATT : 25, SPD : 15
Joe:
HP : 120, ATT : 30, SPD : 10
Bob punches Joe for 25
Joe punches Bob for 30
Bob:
HP : 70, ATT : 25, SPD : 15
Joe:
HP : 95, ATT : 30, SPD : 10
现在,如果您引入了需要独特逻辑来执行攻击的新角色(例如 Warrior 或 Archer),那么创建子类将是值得的。
见:
import java.util.*;
import java.lang.*;
import java.io.*;
class Person
{
protected String _Name;
protected int _Health;
protected int _Attack;
protected int _Speed;
public Person(final String name, final int health, final int attack, final int speed)
{
_Name = name;
_Health = health;
_Attack = attack;
_Speed = speed;
}
public String getName()
{
return _Name;
}
public void status()
{
System.out.println(_Name + ":\nHP : " + _Health + ", ATT : " + _Attack + ", SPD : " + _Speed);
}
public void punch(final Person target)
{
System.out.println(_Name + " punches " + target.getName() + " for " + _Attack);
target.getPunched(_Attack);
}
public void getPunched(int damage)
{
_Health -= damage;
}
}
class Warrior extends Person
{
private int _SwordModifier;
public Warrior(final String name, final int health, final int attack, final int speed)
{
super(name, health, attack, speed);
_SwordModifier = 2;
}
@Override
public void punch(Person target)
{
int damage = _Attack * _SwordModifier;
System.out.println(_Name + " punches " + target.getName() + " with his sword for " + damage);
target.getPunched(damage);
}
}
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
Person bob = new Person("Bob", 100, 25, 15);
Person joe = new Warrior("Joe", 120, 30, 10);
bob.status();
joe.status();
bob.punch(joe);
joe.punch(bob);
bob.status();
joe.status();
}
}
输出:
Bob:
HP : 100, ATT : 25, SPD : 15
Joe:
HP : 120, ATT : 30, SPD : 10
Bob punches Joe for 25
Joe punches Bob with his sword for 60
Bob:
HP : 40, ATT : 25, SPD : 15
Joe:
HP : 95, ATT : 30, SPD : 10