前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#设计原则——合成复用原则

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

原创
作者头像
用户10053120
修改2023-08-25 11:10:48
4550
修改2023-08-25 11:10:48
举报
文章被收录于专栏:C# 设计原则C# 设计原则

一、继承存在的问题

  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. 尽量使用对象组合,而不是继承来达到复用

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档