Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有一种模式可以组合第三方库提供的两个类?_C#_Design Patterns - Fatal编程技术网

C# 是否有一种模式可以组合第三方库提供的两个类?

C# 是否有一种模式可以组合第三方库提供的两个类?,c#,design-patterns,C#,Design Patterns,我有两个来自第三方库的类,它们的功能非常相似,我们称它们为class Car和class Bike。我不能直接对类进行更改,但我希望能够抽象它们,以便像这样使用它们 public bool drive(IDriveable vehicle) { vehicle.Start(); vehicle.Shift(Gear.Drive); vehicle.Accelerate(); //so on... } 有什么我可以做的吗?也许这就是你要找的 在面向对象编程中,de

我有两个来自第三方库的类,它们的功能非常相似,我们称它们为class Car和class Bike。我不能直接对类进行更改,但我希望能够抽象它们,以便像这样使用它们

public bool drive(IDriveable vehicle)
{
    vehicle.Start();
    vehicle.Shift(Gear.Drive);
    vehicle.Accelerate();
    //so on...
}
有什么我可以做的吗?

也许这就是你要找的

在面向对象编程中,decorator模式是一种设计模式,它允许静态或动态地将行为添加到单个对象,而不会影响同一类中其他对象的行为。decorator模式通常有助于坚持单一责任原则,因为它允许在具有独特关注领域的类之间划分功能。[2]decorator模式在结构上与责任链模式几乎相同,区别在于责任链中,只有一个类处理请求,而对于decorator,所有类都处理请求


我将创建一个
BikeDecorator
,和一个
CarDecorator
,两者都实现
IDriveable
,您需要创建一个新的接口IDriveable,其中包含您需要调用的所有函数。在这种情况下,例如,启动和加速。然后,创建两个类,分别是Car和Bike继承BaseCar、BaseBike和实现IDriveable。例如:

使用系统;
使用System.Collections.Generic;
公车
{
公开作废开始()
{
控制台写入线(“启动车辆”);
}
公共图书馆
{
控制台。WriteLine(“加速车”);
}
}
公共级自行车
{
公开作废开始()
{
控制台写入线(“启动自行车”);
}
公共图书馆
{
控制台。WriteLine(“加速自行车”);
}
}
接口IDriveable
{
void Start();
无效加速();
}
汽车类别:汽车,可驾驶
{
//要隐藏父函数,我们使用“new”。我们可以按基调用父函数。
新公共图书馆
{
base.Accelerate();
控制台。WriteLine(“加速CarChild”);
}
}
自行车等级:自行车,可驾驶
{
}
公共课程
{
公共静态void Main()
{
列表设备=新列表();
添加(新的CarChild());
添加(新的BikeChild());
所有(设备);
}
所有专用静态设备(列出设备)
{
foreach(设备中的var设备)
{
device.Start();
加速装置();
}
}

}
据我所知,您需要解决问题的是适配器模式。根据维基百科,适配器模式解决了以下问题:

  • 如果一个类没有客户端所需的接口,该类如何重用
  • 具有不兼容接口的类如何协同工作
  • 如何为类提供替代接口
适配器设计模式描述了如何解决此类问题:

  • 定义一个单独的适配器类来转换(不兼容) 类(适配器)到另一个接口(目标)的接口 客户要求

  • 通过适配器处理(重用)没有 所需的接口


    • 首先让我们假设第三方代码

      public enum Gear
      {
          Drive,
          Stop
      }
      
      汽车的第三方代码如下所示

      public class Car
      {
          public void Start()
          {
              Console.Write($"Start Car");
          }
      
          public void Shift(Gear gear)
          {
              Console.Write($" Shift {gear}");
          }
      
          public void Accelerate()
          {
              Console.Write($" Accelerate Car");
          }
      }
      
      类似地,自行车的第三方代码如下

          public class Bike
      {
          public void Start()
          {
              Console.Write($"Start Bike");
          }
      
          public void Shift(Gear gear)
          {
              Console.Write($" Shift {gear}");
          }
      
          public void Accelerate()
          {
              Console.Write($" Accelerate Bike");
          }
      }
      
      interface IDriveable
      {
          void Start();
      
          void Shift(Gear gear);
      
          void Accelerate();
      } 
      
      class Program
      {
          private static void Main(string[] args)
          {
      
              // USING THE CAR
      
              var car = new DriveableCar();
              car.Start();
              car.Shift(Gear.Drive);
              car.Accelerate();
      
      
              //USING THE BIKE
              var bike = new DriveableBike();
              bike.Start();
              bike.Shift(Gear.Drive);
              bike.Accelerate();
      
      
      
              Console.Read();
          }
      }
      
      然后我们可以如下定义接口

          public class Bike
      {
          public void Start()
          {
              Console.Write($"Start Bike");
          }
      
          public void Shift(Gear gear)
          {
              Console.Write($" Shift {gear}");
          }
      
          public void Accelerate()
          {
              Console.Write($" Accelerate Bike");
          }
      }
      
      interface IDriveable
      {
          void Start();
      
          void Shift(Gear gear);
      
          void Accelerate();
      } 
      
      class Program
      {
          private static void Main(string[] args)
          {
      
              // USING THE CAR
      
              var car = new DriveableCar();
              car.Start();
              car.Shift(Gear.Drive);
              car.Accelerate();
      
      
              //USING THE BIKE
              var bike = new DriveableBike();
              bike.Start();
              bike.Shift(Gear.Drive);
              bike.Accelerate();
      
      
      
              Console.Read();
          }
      }
      
      现在,我们可以为Car定义一个类,如下所示

       class DriveableCar : IDriveable
      {
          private Car _car;
      
          public DriveableCar()
          {
              _car = new Car();
          }
          public void Start()
          {
              _car.Start();
          }        
          public void Accelerate()
          {
              _car.Accelerate();
          }
      
          public void Shift(Gear gear)
          {
              _car.Shift(gear);
          }
      }
      
      对于自行车,我们可以定义另一类,如下所示

      class DriveableBike : IDriveable
      {
          private Bike _bike;
      
          public DriveableBike()
          {
              _bike = new Bike();
          }
          public void Start()
          {
              _bike.Start();
          }
          public void Shift(Gear gear)
          {
              _bike.Shift(gear);
          }
          public void Accelerate()
          {
              _bike.Accelerate();
          }
      }
      
      现在我们可以使用第三方代码,如下所示

          public class Bike
      {
          public void Start()
          {
              Console.Write($"Start Bike");
          }
      
          public void Shift(Gear gear)
          {
              Console.Write($" Shift {gear}");
          }
      
          public void Accelerate()
          {
              Console.Write($" Accelerate Bike");
          }
      }
      
      interface IDriveable
      {
          void Start();
      
          void Shift(Gear gear);
      
          void Accelerate();
      } 
      
      class Program
      {
          private static void Main(string[] args)
          {
      
              // USING THE CAR
      
              var car = new DriveableCar();
              car.Start();
              car.Shift(Gear.Drive);
              car.Accelerate();
      
      
              //USING THE BIKE
              var bike = new DriveableBike();
              bike.Start();
              bike.Shift(Gear.Drive);
              bike.Accelerate();
      
      
      
              Console.Read();
          }
      }
      

      @程序员熟练,希望这能有所帮助。

      CarWrapper
      它实现了
      IDriveable
      ,并包含
      Car
      的一个实例(作为字段/属性)。同样适用于
      BikeWrapper
      。从Car或Bike派生并添加您的函数或用您的函数重写它的函数。@nish在像Accelerate()这样的接口中,我是否能够调用类似这样的东西。base()?@ProgrammerAdept您将是(尽管在类中不是接口)。这是decorator patternIMHO,我通过在我们的客户机中注入第三方组件来使用composition,或者我们可以说是consuming类。我有一个例子,你正在驾驶汽车内强制实例化汽车,也许你没有所有的信息来做这件事。我认为如果你提供外部(装饰师)的实例会更好。是的,因为我可以理解问题的状态,我们可以访问汽车,但不能更改。我不需要任何其他信息来实例化。当然,在真实场景中,我们可以通过任何DI容器进行注入。假设汽车有一个可变数量的参数,你们在DriveableCAR内会怎么做?复制所有构造函数?你为什么不喜欢脱衣舞呢?