1 原理
用C++很好实现,因为C++可以多个继承。
但是C#、Java等语言不能多继承类,只能多继承接口。
使用这些语言实现Adapter模式,只能将想要适配的两个类或者更多类抽象出接口,
然后将适配器继承这些接口,使用方法或者构造方法,
将想要适配的类的实例传入适配器,然后通过适配器调用各个的方法。
2 代码
using UnityEngine;
using System.Collections;
namespace Adapter{
public interface IClassA{
void sayA();
}
public interface IClassB{
void sayB();
}
public class ClassA : IClassA{
public void sayA(){
Debug.Log("ClassA");
}
}
public class ClassB : IClassB{
public void sayB(){
Debug.Log("ClassB");
}
}
public class Adapter : IClassA , IClassB{
public ClassA a;
public ClassB b;
public Adapter(ClassA a){
this.a = a;
}
public Adapter(ClassB b){
this.b = b;
}
public virtual void sayA(){
if(null != a){
a.sayA();
}
}
public virtual void sayB(){
if(null != b){
b.sayB();
}
}
}
public class AdapterDemo : MonoBehaviour {
void Start(){
Adapter a = new Adapter(new ClassA());
a.sayA();
Adapter b = new Adapter(new ClassB());
b.sayB();
}
}
}
3 总结
在 Adapter 模式的两种模式中,有一个很重要的概念就是接口继承和实现继承的区别和 联系。接口继承和实现继承是面向对象领域的两个重要的概念,接口继承指的是通过继承, 子类获得了父类的接口,而实现继承指的是通过继承子类获得了父类的实现(并不统共接 口)。在 C++中的 public 继承既是接口继承又是实现继承,因为子类在继承了父类后既可以 对外提供父类中的接口操作,又可以获得父类的接口实现。当然我们可以通过一定的方式和 技术模拟单独的接口继承和实现继承,例如我们可以通过 private 继承获得实现继承的效果 (private 继承后,父类中的接口都变为 private,当然只能是实现继承了。),通过纯抽象基 类模拟接口继承的效果,但是在 C++中 pure virtual function 也可以提供默认实现,因此这是 不纯正的接口继承,但是在 Java 中我们可以 interface 来获得真正的接口继承了。