适配器模式:将一个类的接口转为另一个接口,使由于接口不兼容的而不能工作在一起的那些类可以一起工作。在C#视频中就接触到它了,当时就对它挺好奇的。我形象的称它为:充电器模式。到大话了,又重新学习了它,很有亲切感。而且还知道了有两种适配器:类适配器和对象适配器。
根据定义我们知道当我们的类的接口不一致时,可以使用该模式。一般情况下,我们想复用现有的类,但是类的接口与复用环境不一致,那我们就可以用适配器模式了。
类图:
代码部分就不写了,感觉挺简单的,但是在敲代码时,发现了了一个有趣的事情。还得看代码
abstract class Player //这是一个抽象父类
{
protected string name;
<span style="color:#ff0000;"> // public Player()
// {}</span></span>
public Player(string name)
{
this.name = name;
}
public abstract void Attack();
public abstract void Defense();
}
class Forwards:Player //这是一个具体的子类
{
public Forwards(string name)<span style="color:#ff0000;">:base(name)</span>
{
}
public override void Attack()
{
Console.WriteLine("前锋{0} 进攻", name);
}
public override void Defense()
{
Console.WriteLine("前锋 {0} 防守", name);
}
}
再敲适配器这块代码时,base关键字总是出现,我就不明白了base关键字为什么在这里出现呢,还每个子类都出现。果断就把这个关键字去了,于是程序果断给了我个提示:Player类没有参数为0的构造函数。于是乎我就给Player类一个无参的构造函数,发现还真行,这个错误就没有了。不过没明白base这个名词,到网上查了查。看完后觉得自己的面向对象基础实在是薄弱啊。继续努力吧
发现:new 一个类的对象,不是直接创建这个对象的,而是先加载这个类,然后加载父类,也就是说类的加载是从下而上的顺序加载的,类加载完了,就是创建对象,创建对象是从上而下的顺序创建的,先父类对象,后子类对象。以便于子类继承父类的一些属性方法。
最后再回归我们的问题:父类没有参数为0的构造函数,原来子类的构造函数初始化时,会先找父类的构造函数,如果没有指定父类哪个构造函数时,他会找父类无参的构造函数,所以当找不到时就会报错了。我想这就是问题的症结所在。而base这个关键字,我想就是指定子类调用父类的哪个构造函数吧。但是当父类的构造函数多种多样呢,怎么用base关键字呢。继续学习中。
欢迎大家及时留言,指出自己的理解错误。点击参考博客——子类对象的创建过程