本质论之封装继承和多态的介绍

1 篇文章 0 订阅
1 篇文章 0 订阅

关于 类,我有一些话想说

说到类那就说到了面向对象的灵魂了,没有它也就没有了封装、继承and多态这些东西了。我还记得在读研期间每次看到这些都望而却步,甚至我搞不懂对象和类的区别(这里防止有人也不知道区别是什么我借用书上的描述写一下:类是模板,对象是类的实例化。万万不可把类与对象画等号,通俗点来说是类是实例化之前,对象是实例化之后)。学生阶段写的代码很没有规则没有任何设计模式,唯一的要求就是可以跑。
哈哈哈哈哈,代码能跑只是第一步,能跑和跑的快差了十万八千里,跑的快和跑的姿势优美又差了十万八千里。可以说是学生阶段一直都没有搞明白搞清楚这些东西,首先是自己懒得学,能写出来一点东西就不想再多花点时间多去学习了,其次无论大学还是研究生阶段老师们都只专注于学术或者项目,很少真的会让学生去深究代码应该怎么写,要求就是能跑。当然最大的问题还是在我自己,工作后真的开始敲代码了才知道,自己的代码能力是这么的有限。越学越觉得需要学习以及需要知道的东西才越多,当然开始在CSDN上写博客也是希望更多的人一起学习。闲言少叙,直接开始吧。

一、类的修饰符

类的修饰符有很多种哦,对于一个class来说它可以被public private abstract 等等乱七八糟的东西所修饰,我在csdn上随便找了一个人的文章可以看看关于修饰符的连接

二、封装、继承、多态

1.封装

曾经我很不理解为什么叫封装,其实就是一种高大上的叫法罢了,本质论中提到的更好——组合。比如:我是小阿Giao,那我的的名字、年龄、职业、学历等等组合在一起,这就叫“封装”。
当然还是得规范一点,封装就是对字段 属性 方法这些进行必要的隐藏,不能让客户端随意的对数据进行篡改。关于封装这些都是很好理解的,我不想多做解释。

2.继承

对于新手来说,可能到了继承这里就出现问题了(我自己是这样的哈哈)。那么继承具体是一种什么东西呢?举个例子:人有两个手,左手和右手,左手和右手都继承了手这个抽象的父类。抽象的父类顾名思义就是这个被继承的类很抽象很模糊(真是听君一席话,如听一席话),它抽象到可以代表一切子类。举个例子:抽象类:人;具体类:中国人;这里“人”相对“中国人”来说就是抽象的父类。
之所以用抽象类“手”做为例子是因为根据依赖倒转原则所有的类最终都应该继承一个抽象类或者接口

    public abstract class Hand
    {
        string name;
    }
    public class RightHand:Hand
    {
    }
    public class LeftHand : Hand
    {
    }

接下来再实例化(以右手为例):

   static void Main(string[] args)
   {
        RightHand rightHand = new RightHand();
        rightHand.Name = "右手";
    }

可以看出来右手的类里面本没有Name这个属性,但是父类的手里面有所以它也有。接下来再看看怎么继承一个接口。接口的关键字是interface,举个例子:

    interface Icarry
    { }
    public abstract class Hand
    {
        public string Name { get; set; } 
    }
    public class RightHand : Hand,Icarry
    {    
    }
    public class LeftHand : Hand, Icarry
    {
    }

一个类只能有一个父亲,但是可以有很多接口,目前这个接口没写东西,在下面的多态进行解释。

3.多态

有的时候不得不感慨中国的语言真的博大精深,言简意赅。“多态”又是一个高大上的名字,又是一个及其迷惑人的词汇,其实它根本不难,将介绍三种方法以左右手的方式实现多态。

  • 首先是V-O实现
    这里的V代表virtual,O代表Override,直接看代码
 interface Icarry
    { }
    public abstract class Hand
    {
        public string Name { get; set; }
        public virtual void VO()
        {
            Console.WriteLine(this.Name);
        }
    }
    public class RightHand : Hand,Icarry
    {
        public override void VO()
        {
            Console.WriteLine("我是右手啦啦啦");
        }
    }

客户端代码:

  static void Main(string[] args)
        {
            RightHand rightHand = new RightHand();
            rightHand.Name = "右手";
            rightHand.VO();
            Console.ReadKey();
        }

结果:在这里插入图片描述
在RightHand中使用Override对父类中对Virtual修饰的方法进行重写。可以把本来的方法变个样子。

  • 其次是抽象方法实现
    使用这个方法需要注意一点,就是抽象方法必须必须必须在抽象类里面,而且子类必须要实现此方法,不然就会出现这个错误:
    在这里插入图片描述
    ok,使用alt+enter实现抽象类方法以后,上代码:
  public abstract class Hand
    {
        public string Name { get; set; }
        public abstract void Abstract();
        
    }
    public class RightHand : Hand,Icarry
    {
        public override void Abstract()
        {
            Console.WriteLine("我是抽象方法实现的右手");
        }
    }

客户端实现跟第一点VO一样,结果是这样:
在这里插入图片描述

  • 最后是接口
    还记得上面介绍继承的时候空着的接口吗?接口是个特别好玩的东西,他相当于一个道具,可以赋予继承的类一些功能。
    比如,我可以给右手射击的一项技能,左手变成飞机的一个技能,代码如下:
  interface Icarry
    {
        void Doit();//接口中的方法
    }
    public abstract class Hand
    {
        public string Name { get; set; }
    }
    public class RightHand : Hand,Icarry
    {
        public void Doit()
        {
            Console.WriteLine("我可以射击!");
        }
    }
    public class LeftHand : Hand, Icarry
    {
        public void Doit()
        {
            Console.WriteLine("我可以变成飞机!");
        }
    }

客户端代码:

  static void Main(string[] args)
        {
            RightHand rightHand = new RightHand();
            rightHand.Name = "右手";
            rightHand.Doit();
            LeftHand leftHand = new LeftHand();
            leftHand.Name = "左手";
            leftHand.Doit();
            Console.ReadKey();
            
        }

结果:
在这里插入图片描述
值得注意的是接口中的方法必须要在子类中实现,不然左右手的功能可就不全了哦。

总结

以上的继承封装多态,以左右手为例的代码,是我自己学习过程中理解,如果有不对的可以一起交流。对于小白来说绝对通俗易懂。当然对于类中还有构造函数、析构函数、密封的类诸多知识点,在以后的博客中可能会继续介绍。在面向对象编程中,这些都是想通的,无论是java还是c#还是别的都是必须要学习的东西,学会了这些才算是真正的入门了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
封装继承多态是面向对象编程中的三大特性,C++也支持这三种特性。 1. 封装 封装是指将数据和对数据的操作封装在一起,形成一个类。类中的数据和方法可以设置为私有的,只有类内部可以访问,外部无法访问。这样可以保证数据的安全性和完整性。 下面是一个封装的例子: ```c++ class Person { private: string name; int age; public: void setName(string n) { name = n; } void setAge(int a) { age = a; } string getName() { return name; } int getAge() { return age; } }; ``` 2. 继承 继承是指一个类可以继承另一个类的属性和方法。被继承的类称为父类或基类,继承的类称为子类或派生类。子类可以使用父类的属性和方法,也可以重写父类的方法。 下面是一个继承的例子: ```c++ class Student : public Person { private: int id; public: void setId(int i) { id = i; } int getId() { return id; } }; ``` 3. 多态 多态是指同一种类型的对象,在不同的情况下可以有不同的表现形式。C++中实现多态有两种方式:虚函数和模板。 下面是一个虚函数的例子: ```c++ class Shape { public: virtual double getArea() { return 0; } }; class Circle : public Shape { private: double radius; public: Circle(double r) { radius = r; } double getArea() { return 3.14 * radius * radius; } }; class Rectangle : public Shape { private: double width; double height; public: Rectangle(double w, double h) { width = w; height = h; } double getArea() { return width * height; } }; ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

码农Giao哥哥

如果觉得不错的话请打赏一波呗

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

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

打赏作者

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

抵扣说明:

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

余额充值