继承和组合都可以交替用于代码重用能力。
为什么组合优先于继承?
最好使用组合而不是继承,因为它服务于代码重用能力的目的,而无需担心更改的涓滴效应。因此,它提供了更松散的耦合,我们不必担心更改某些代码会导致其他一些需要更改的依赖代码。
例如:
考虑我们有以下类:
class Person
{
public String name;
public int age;
public Person(String name,int age)
{
this.name = name;
this.age = age;
}
}
class Student : Person
{
public String rollNumber;
public double cgpa;
public Student(String rollNumber,double cgpa,String name,int age):base(name,age)
{
this.rollNumber = rollNumber;
this.cgpa = cgpa;
}
}
//and the main which call these as
static void Main(string[] args)
{
Student student = new Student("Roll1234", 3.5, "John Doe", 32);
}
现在,如果 Person 类要更改并如下所示:
class Person
{
public String firstName;
public String lastName;
public int age;
public Person(String firstName, String lastName, int age)
{
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
}
如果不更改从 Person 类继承的所有类(在我们的 Student 类中),则无法实现此更改。
现在考虑另一种情况,我们在下面的代码中使用了组合:
class Person
{
public String name;
public int age;
public Person(String name,int age)
{
this.name = name;
this.age = age;
}
}
class Student
{
public String rollNumber;
public double cgpa;
public Person person;
public Student(String rollNumber,double cgpa,Person person)
{
this.rollNumber = rollNumber;
this.cgpa = cgpa;
this.person = person;
}
}
//and the main
static void Main(string[] args)
{
Person person = new Person("John Doe", 32);
Student student = new Student("Roll1234", 3.5, person);
}
现在在这种情况下,如果我们要对 Person 类进行如下更改:
class Person
{
public String firstName;
public String lastName;
public int age;
public Person(String firstName, String lastName, int age)
{
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
}
我们根本不需要更改 Student 班级。因此,组合使我们的设计在变化时更加灵活。
然而经验法则是,如果存在“is a”关系,则选择继承,而“has a”关系则选择组合。
但请记住,如果您想实现代码重用组合将始终是一个更好的选择。