白话编程---面向对象(3)_类和接口

前言

        讨论面向对象中类和接口的关系

引入

        类是对象的模板,对象是可以做事的个体,他做的事就是对象方法.之前说到过资源类是不能做事的,因为没有把显示其本身考虑进去.能坚持看到这里,适当修正一下看法:).

        前面我们说到函数的本质是:我想做一件事.一个函数可以帮你做一件事.那么问题来了,如果你想做的事是在几件事里选一件的,该如何表达呢?举例:我想做家务,那么请问我是想做饭,洗衣,拖地,或者其他某件家务事的时候,怎样表示呢?我们可以表示我在做家务,但实际上我在做饭.这就是接口的由来----将抽象的表达和具体的实现分离.

接口和类的关系

        接口和类(接口实现类)之间的关系,类似指针和数据集合的关系.指向某个数据集合的指针,可以访问到数据集合内任一单个数据.当调用接口的虚方法,实际上是在调用接口实现类中的对应方法.

        接口的核心是其包含的虚方法.

接口的好处

        编程就是在满足不同的需求,在让程序员"做某件事".当需求来了之后,把它丢给接口,接口的虚方法就是"做这件事".具体由谁来完成(接口实现类),具体步骤如何,可以不去暂时先不予理会.这也是面向对象编程的好处---先制定个框架,再去实现.自顶向下的设计方法.

接口的写法

         接口类可以有属性,也可以没有.至少有一个纯虚方法

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();                             //调用接口虚方法,实则采用了狗的动作

   ========================================================================

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jllws1

你的鼓励是我创作的动力,谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值