一、继承存在的问题
- 破坏系统的封装性,父类变,子类的实现也要变;
- 子类如不需要父类的Method3,则系统的耦合性变高;
- 继承是静态的,不能在程序运行时发生改变。
什么时候偶使用继承,什么时候使用对象组合?
- Is A时使用继承,比如汽油车是汽车。
- has A时使用对象组合的方式的,比如大雁有翅膀。
public interface IColor
{
string ShowColor();
}
public class White:IColor
{
public string ShowColor()
{
return "白色";
}
}
public class Black : IColor
{
public string ShowColor()
{
return "黑色";
}
}
public class Red : IColor
{
public string ShowColor()
{
return "红色";
}
}
public abstract class Car
{
public IColor color;
public Car(IColor color)
{
this.color = color;
}
public abstract void Run();
}
public class QYCar : Car
{
public QYCar(IColor color):base(color)
{
}
public override void Run()
{
Console.WriteLine($"{this.color.ShowColor()}的汽油车在行驶。");
}
}
二·、组合和聚合、依赖
- 组合是整体与部分的关系,部分没有独立的生命周期,组合是把部分作为整体类的对象,比如老虎和Leg。
- 聚合也是整体与部分的关系,但是个体有独立的生命周期,聚合是把个体对象的指针(引用)作为整体类的属性,如TigerGroup和Tiger。
三、类之间的六种关系
泛化、实现、组合、聚合、关联、依赖
- 泛化
public class Animal
{
private char _gender;
public void Eat()
{
Console.WriteLine("吃饭");
}
public void Sleep()
{
Console.WriteLine("睡觉");
}
}
public class Teger:Animal
{
private string Name;
}
2.实现
代码语言:javascript复制public interface IClimb
{
void Climb();
}
public class Teger:Animal;IClimb
{
private string Name;
public void Climb()
{
Console.WriteLine("老虎爬树");
}
}
3.组合
组合是把部分作为整体类的对象。has a
代码语言:javascript复制public class Leg
{
private _count;
}
public class Teger:Animal;IClimb
{
private string Name;
private Leg _leg;
//组合关系是强拥有关系,个体/部分不存在生命周期,个体/部分与整体的生命周期保持一致
public Tiger(Leg leg)
{
this._leg=leg;
}
public void Climb()
{
Console.WriteLine("老虎爬树");
}
}
4.聚合
聚合也是整体与部分的关系,是弱拥有关系,但是个体有独立的生命周期,聚合是把个体对象的指针(引用)作为整体类对象的属性。 has a
代码语言:javascript复制public class TigerGroup
{
//聚合关系,是弱拥有关系
private Tiger[] tigers;
}
5.关联关系
关联也是一种拥有关系,它是一个类知道另一个类的属性和方法,是需要了解、知道的关系。has a
代码语言:javascript复制public class Food
{
public string FoodName;
public string FoodClor;
}
public class Tiger
{
private Food food;
}
6.依赖关系
是一种使用关系。 use a
(语法层面上有把water写成接口、set、构造函数的参数三种依赖关系)。
代码语言:javascript复制public class Water
{
private float _weight;
}
public class Tiger
{
public void Drink(Water water)
{
}
}
四.合成复用原则
合成复用原则是将已有的对象纳入到新对象中,作为新对象的对象成员来实现的,新对象可以调用已有对象的功能,从而达到复用。
- 合成复用原则又称组合/聚合复用原则;
- 尽量使用对象组合,而不是继承来达到复用