我们假设我有以下课程:
public abstract class Animal {
protected final String noise;
public Animal(String noise) {
this.noise = noise;
}
public void makeNoise() {
System.out.println(noise);
}
}
public class Dog extends Animal{
public Dog(){
super("woof");
}
}
如您所见,这两个类共享几乎相同的代码。要删除冗余代码,我要创建一个像这样的父类:
public function get_detail_activity()
{
$status= $this->activity();//call function model activity
$query=$this->db->query("SELECT
t_trx_activity.activity_id FROM t_trx_activity
JOIN t_trx_activity_detail ON
t_trx_activity_detail.activity_id =t_trx_activity.activity_id
WHERE t_trx_activity.activity_id = '".$status."'");
if($query->num_rows()>0)
{
return $query->result_array();
}
else
{
return array();
}
}
public function activity()
{
$query=$this->db->query("SELECT t_trx_activity.activity_id
FROM t_trx_activity
ORDER BY
t_trx_activity.activity_id DESC LIMIT 1");
$nik=$this->session->userdata('nik');
if($query->num_rows()>0)
{
return $query->row()->activity_id;
}
else
{
return 0;
}
}
现在不幸的是我遇到了两个问题:
可能的解决方案就是这样: public abstract void makeNoise(); 这既不被允许,也不会消除将代码复制到Animal的每个人和每个人的需要。
如何在保持方法makeNoise静态的同时消除动物子代中冗余代码的需要?
答案 0 :(得分:1)
Java中的静态方法无法在子类中重写。
如果在子类中使用与父类中的静态方法相同的签名定义静态方法,则该方法不会覆盖父方法隐藏它。父类和子类中的方法彼此无关。
在您的示例中,如果static void makeNoise()
中存在方法Animal
,并且任何子类也定义了该方法,则子类只是将makeNoise
方法隐藏在Animal中。
在您的示例中,您可以使用静态方法执行的最佳操作是:
public static void makeNoise(String noise) {
System.out.println(noise);
}
以这种方式调用方法:
Animal.makeNoise(Cat.NOISE); // A constant NOISE is defined in each subclass
如果方法makeNoise
是非静态的,则可以使用继承在每个子类中使用不同的噪声:
public abstract class Animal {
protected String noise;
protected Animal(String noise) {
this.noise = noise;
}
public void makeNoise() {
System.out.println(noise);
}
}
public class Cat extends Animal{
public static final String NOISE = "meow";
public Cat() {
super(NOISE);
}
}
答案 1 :(得分:0)
为什么用静态方法表示真实世界的对象行为?每只动物都有它自己的行为,所以你想要区分它们。
enum AnimalBehavior {
MEOW, WOOF, ROAR
}
您可以使用包含每种动物行为的枚举。 还要考虑以下情况:狼在满月之夜嚎叫。他一直这样做,直到他筋疲力尽。你想跟踪一个指示狼的能量水平的条形码。
private int energy = 100;
public static void wolfHowl() {
System.out.println(AnimalBehavior.ROAR);
energy = energy - 10;
}
这在技术上不会起作用,因为你正在使用静态方法..所以请记住你如何设计你的东西,因为狼实际上可以嚎叫而不会累,直到有人真的生气。