C# 适配器模式实现中的困惑

C# 适配器模式实现中的困惑,c#,.net,design-patterns,adapter,C#,.net,Design Patterns,Adapter,我正在学习适配器模式,并使用以下链接查看代码。我的代码和示例代码的不同之处在于,我删除了ITarget接口,并直接在客户机中创建了对象 我知道使用接口的重要性,但是否真的有必要使用接口,更具体地说,通过不创建接口,我是否违反了适配器模式规则 我的代码(没有接口) 谢谢。适配器的全部要点是,只要需要某种类型的适配器,而不是适配器的类型,就可以使用适配器 假设您有一个方法MyMethod(MyParameterType m)。此方法需要类型为MyParameterType的参数。但是您没有这种类型

我正在学习适配器模式,并使用以下链接查看代码。我的代码和示例代码的不同之处在于,我删除了ITarget接口,并直接在客户机中创建了对象

我知道使用接口的重要性,但是否真的有必要使用接口,更具体地说,通过不创建接口,我是否违反了适配器模式规则

我的代码(没有接口)


谢谢。

适配器的全部要点是,只要需要某种类型的适配器,而不是适配器的类型,就可以使用适配器

假设您有一个方法
MyMethod(MyParameterType m)
。此方法需要类型为
MyParameterType
的参数。但是您没有这种类型的对象。相反,您有一个具有类似功能的对象(可能来自第三方库)。但是,此对象不是类型
MyParameterType
,而是类型
MyOtherType
。当然,不能直接将对象传递给方法。这就是适配器发挥作用的地方

您需要一个对象来传递给该方法。因此,此对象的类型必须为
MyParameterType
;它可能是一个接口或类。因此,
适配器
必须实现或继承此类型。否则,它就没有意义了。您只需要拥有另一个类,该类的功能与类型为
MyOtherType
的对象相同,但您不能在任何地方使用它


总之,适配器用于桥接体系结构不匹配。当您有多个库需要一起玩但不应该一起玩时,通常会发生这种情况。如果您只有自己开发的代码,那么很少需要适配器,因为您可以让对象只实现所需的接口。这在第三方代码中是不可能的。为此,您引入了适配器。因此,适配器最终会将对象伪装成客户机熟悉的对象,即使它不是。界面是必要的,以使其熟悉。因此,是的,您的代码不是适配器。

适配器的全部要点是,只要需要某种类型的适配器,而不是适配器的类型,就可以使用适配器

假设您有一个方法
MyMethod(MyParameterType m)
。此方法需要类型为
MyParameterType
的参数。但是您没有这种类型的对象。相反,您有一个具有类似功能的对象(可能来自第三方库)。但是,此对象不是类型
MyParameterType
,而是类型
MyOtherType
。当然,不能直接将对象传递给方法。这就是适配器发挥作用的地方

您需要一个对象来传递给该方法。因此,此对象的类型必须为
MyParameterType
;它可能是一个接口或类。因此,
适配器
必须实现或继承此类型。否则,它就没有意义了。您只需要拥有另一个类,该类的功能与类型为
MyOtherType
的对象相同,但您不能在任何地方使用它


总之,适配器用于桥接体系结构不匹配。当您有多个库需要一起玩但不应该一起玩时,通常会发生这种情况。如果您只有自己开发的代码,那么很少需要适配器,因为您可以让对象只实现所需的接口。这在第三方代码中是不可能的。为此,您引入了适配器。因此,适配器最终会将对象伪装成客户机熟悉的对象,即使它不是。界面是必要的,以使其熟悉。因此,是的,您的代码不是适配器。

适配器的全部要点是,只要需要某种类型的适配器,而不是适配器的类型,就可以使用适配器

假设您有一个方法
MyMethod(MyParameterType m)
。此方法需要类型为
MyParameterType
的参数。但是您没有这种类型的对象。相反,您有一个具有类似功能的对象(可能来自第三方库)。但是,此对象不是类型
MyParameterType
,而是类型
MyOtherType
。当然,不能直接将对象传递给方法。这就是适配器发挥作用的地方

您需要一个对象来传递给该方法。因此,此对象的类型必须为
MyParameterType
;它可能是一个接口或类。因此,
适配器
必须实现或继承此类型。否则,它就没有意义了。您只需要拥有另一个类,该类的功能与类型为
MyOtherType
的对象相同,但您不能在任何地方使用它


总之,适配器用于桥接体系结构不匹配。当您有多个库需要一起玩但不应该一起玩时,通常会发生这种情况。如果您只有自己开发的代码,那么很少需要适配器,因为您可以让对象只实现所需的接口。这在第三方代码中是不可能的。为此,您引入了适配器。因此,适配器最终会将对象伪装成客户机熟悉的对象,即使它不是。界面是必要的,以使其熟悉。因此,是的,您的代码不是适配器。

适配器的全部要点是,只要需要某种类型的适配器,而不是适配器的类型,就可以使用适配器

假设您有一个方法
MyMethod(MyParameterType m)
。此方法需要类型为
MyParameterType
的参数。但是您没有这种类型的对象。相反,您有一个具有类似功能的对象(可能来自第三方库)。但是,此对象不是类型
MyParameterType
,而是类型
MyOtherType
。当然,不能直接将对象传递给方法。这就是适配器com的位置
class Program
    {
        static void Main(string[] args)
        {
            Adapter obj = new Adapter();
            Client client = new Client(obj);

            client.MakeRequest();
        }
    }

    public class Client
    {
        private Adapter _target;

        public Client(Adapter target)
        {
            _target = target;
        }

        public void MakeRequest()
        {
            _target.MethodA();
        }
    }


    public class Adaptee
    {
        public void MethodB()
        {
            Console.WriteLine("MethodB called");
        }
    }


    public class Adapter 
    {
        Adaptee _adaptee = new Adaptee();

        public void MethodA()
        {
            _adaptee.MethodB();
        }
    }
public Client(IAdapter target) ...
interface IAdapter
{
    void MethodA();
}

interface IAdaptee
{
    void MethodB();
}

class Adapter<TAdaptee> : IAdapter where TAdaptee : IAdaptee, new()
{
    private TAdaptee _adaptee;

    public Adapter()
    {
        _adaptee = new TAdaptee();
    }

    public void MethodA()
    {
        _adaptee.MethodB();
    }
}

class AdapteeA : IAdaptee
{
    public void MethodB()
    {
        Console.WriteLine("AdapteeA");
    }
}

class AdapteeB : IAdaptee
{
    public void MethodB()
    {
        Console.WriteLine("AdapteeB");
    }
}
class Program
{
    private static StandardKernel _kernel;

    static void Main(string[] args)
    {
        _kernel = new StandardKernel();

        _kernel.Bind<IAdapter>().To<Adapter<AdapteeA>>();

        var adapter = _kernel.Get<IAdapter>();

        adapter.MethodA();
    }
}
_kernel.Bind<IAdapter>().To<Adapter<AdapteeB>>();