圣诞大减价开始了!

上拉构造器本体

问题

子类的构造函数代码基本相同。

解决方案

创建一个超类构造函数,并将子类中相同的代码移动到它。在子类构造函数中调用父类构造函数。

之前
class Manager extends Employee {public Manager(String name, String id, int grade) {this.name = name;这一点。Id = Id;这一点。Grade =年级;} //…}
class Manager extends Employee {public Manager(String name, String id, int grade) {super(name, id);这一点。Grade =年级;} //…}
之前
public class Manager:雇员{public Manager(字符串名称,字符串id, int grade) {this.name = name;这一点。Id = Id;这一点。Grade =年级;} //…}
public class Manager: Employee {public Manager(字符串名称,字符串id, int grade): base(名称,id) {this。Grade =年级;} //…}
之前
class Manager扩展Employee{公共函数__construct($name, $id, $grade) {$this->name = $name;$this->id = $id;$this->grade = $grade;} //…}
类经理扩展雇员{公共函数__construct($name, $id, $grade) {parent::__construct($name, $id);$this->grade = $grade;} //…}
之前
class Manager(Employee): def __init__(self, name, id, grade): self.name = name self。Id = Id self。年级=年级#…
class Manager(Employee): def __init__(self, name, id, grade): Employee。__init__(name, id) self。年级=年级#…
之前
类管理器扩展雇员{构造函数(名称:字符串,id:字符串,等级:数字){this.name = name;这一点。Id = Id;这一点。Grade =年级;} //…}
类经理扩展雇员{构造函数(名称:字符串,id:字符串,等级:数字){超级(名称,id);这一点。Grade =年级;} //…}

为什么重构

这种重构技术与之有何不同上拉法吗?

  1. 在Java中,子类不能继承构造函数,因此不能简单地应用构造函数上拉法并在删除父类的所有构造函数代码后删除它。除了在父类中创建构造函数外,还需要在子类中具有简单委托给父类构造函数的构造函数。

  2. 在c++和Java中(如果您没有显式调用超类构造函数),超类构造函数会在子类构造函数之前自动调用,这使得有必要将公共代码仅从子类构造函数的开头移动(因为您不能从子类构造函数中的任意位置调用超类构造函数)。

  3. 在大多数编程语言中,子类构造函数可以有自己的形参列表,这些形参不同于父类的形参。因此,创建父类构造函数时,应该只使用它真正需要的参数。

如何重构

  1. 在超类中创建构造函数。

  2. 从每个子类构造函数的开头提取公共代码到父类构造函数。在此之前,尝试将尽可能多的公共代码移到构造函数的开头。

  3. 将父类构造函数的调用放在子类构造函数的第一行中。

Baidu
map