C#设计原则——合成复用原则

2023-08-25 11:10:48 浏览数 (1)

一、继承存在的问题

  1. 破坏系统的封装性,父类变,子类的实现也要变;
  2. 子类如不需要父类的Method3,则系统的耦合性变高;
  3. 继承是静态的,不能在程序运行时发生改变。

什么时候偶使用继承,什么时候使用对象组合?

  1. Is A时使用继承,比如汽油车是汽车。
  2. has A时使用对象组合的方式的,比如大雁有翅膀。
代码语言:javascript复制
  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。

三、类之间的六种关系

泛化、实现、组合、聚合、关联、依赖

  1. 泛化
代码语言:javascript复制
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)
    {
        
    }
}

四.合成复用原则

合成复用原则是将已有的对象纳入到新对象中,作为新对象的对象成员来实现的,新对象可以调用已有对象的功能,从而达到复用。

  1. 合成复用原则又称组合/聚合复用原则;
  2. 尽量使用对象组合,而不是继承来达到复用

0 人点赞