前言
讨论面向对象中类和接口的关系
引入
类是对象的模板,对象是可以做事的个体,他做的事就是对象方法.之前说到过资源类是不能做事的,因为没有把显示其本身考虑进去.能坚持看到这里,适当修正一下看法:).
前面我们说到函数的本质是:我想做一件事.一个函数可以帮你做一件事.那么问题来了,如果你想做的事是在几件事里选一件的,该如何表达呢?举例:我想做家务,那么请问我是想做饭,洗衣,拖地,或者其他某件家务事的时候,怎样表示呢?我们可以表示我在做家务,但实际上我在做饭.这就是接口的由来----将抽象的表达和具体的实现分离.
接口和类的关系
接口和类(接口实现类)之间的关系,类似指针和数据集合的关系.指向某个数据集合的指针,可以访问到数据集合内任一单个数据.当调用接口的虚方法,实际上是在调用接口实现类中的对应方法.
接口的核心是其包含的虚方法.
接口的好处
编程就是在满足不同的需求,在让程序员"做某件事".当需求来了之后,把它丢给接口,接口的虚方法就是"做这件事".具体由谁来完成(接口实现类),具体步骤如何,可以不去暂时先不予理会.这也是面向对象编程的好处---先制定个框架,再去实现.自顶向下的设计方法.
接口的写法
接口类可以有属性,也可以没有.至少有一个纯虚方法
class SomeOne{
public:
Virtual void homework() =0;
}
纯虚方法的写法
Virtual + 方法声明 + =0;
在普通方法声明前加" Virtual ",后面加" =0 "
纯虚方法可以定义,也可以不定义,定义好的纯虚方法可以在继承的类中被使用
接口类树的设计
前面说了资源类和能动类,把他们看成基本类,直接或间接映射到硬件寄存器
接口类(抽象基类)完全面对虚方法,接口类的实现类,不要直接采用资源类或者能动类,而是另外创建一种接口实现类.
这样做的优点有:一.避开多重继承;二:不让基本类受污染.
缺点:可能造成过多的接口实现类.
说明:接口的设计方法也很多,看个人的编程习惯,以及具体场景.
举例:建立一个动物类接口,实现类有猫和狗
接口:
class Animal{
public:
Virtual void action() =0;
}
猫类:
class Cat:public Animal{
private:
String name;
public:
Cat(String na);
Virtual void action(){
cout<<"喵喵喵"<<endl;
}
}
狗类:
class Dog:public Animal{
private:
String name;
public:
Dog(String na);
Virtual void action(){
cout<<"跳跳跳"<<endl;
}
}
很多书上都是推荐这样写的,但是不推荐这样写,可以这样写:
接口:
class AnimalAction{
public:
Virtual void do() =0;
}
实现类1---猫动作
class CatAction:public AnimalAction{
private:
Cat& cat;
public:
CatAction(Cat& c);
Virtual void do(){
cat.shout();
}
}
实现类2---狗动作
class DogAction:public AnimalAction{
private:
Dog& dog;
public:
DogAction(Dog& d);
Virtual void do(){
dog.jump();
}
}
基本类--猫类
class Cat{
private:
String name;
public:
Cat(String na);
void shout(){
cout<<"喵喵喵"<<endl;
}
}
基本类--狗类
class Dog{
private:
String name;
public:
Dog(String na);
void jump(){
cout<<"跳跳跳"<<endl;
}
}
使用:
Dog dh=Dog("大黄"); //生成一条名叫"大黄"的狗
AnimalAction & aadh=DogAction(dh); //产生动作并转型成接口
aadh.do(); //调用接口虚方法,实则采用了狗的动作
========================================================================