封装,继承,多态

面向对象的三个基本特征

面向对象的三个基本特征是:封装、继承、多态。其中,封装 可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!

对象:万物皆对象
:类就是具有相同的属性和功能的对象的抽象的集合
实例:对象就是类的实例

这里写图片描述

封装

什么是封装?

封装可以隐藏实现细节,使得代码模块化;在面向对象编程上可理解为:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

封装的意义?

封装的意义在于保护或者防止代码(数据)被我们无意中破坏。在面向对象程序设计中数据被看作是一个中心的元素并且和使用它的函数结合的很密切,从而保护它不被其它的函数意外的修改。

  1. 保护数据成员,不让类以外的程序直接访问或修改,只能通过提供的公共的接口访问==>数据封装

  2. 方法的细节对用户是隐藏的,只要接口不变,内容的修改不会影响到外部的调用者==> 方法封装

  3. 当对象含有完整的属性和与之对应的方法时称为封装。

  4. 从对象外面不能直接访问对象的属性,只能通过和该属性对应的方法访问。

  5. 对象的方法可以接收对象外面的消息。

封装时的权限控制符区别如下:
这里写图片描述

继承

什么是继承?

继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。其继承的过程,就是从一般到特殊的过程。

通过继承创建的新类称为“子类”或“派生类”。被继承的类称为“基类”、“父类”或“超类”。要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。

继承的实现方式?

继承概念的实现方式有三类:实现继承、接口继承和可视继承。

  1. 实现继承是指使用基类的属性和方法而无需额外编码的能力;

  2. 接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;

  3. 可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力。

多态

什么是多态?

“一个接口,多种方法”,同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。

多态的三个条件?

a. 继承的存在(继承是多态的基础,没有继承就没有多态).
b. 子类重写父类的方法(多态下调用子类重写的方法).
c. 父类引用变量指向子类对象(子类到父类的类型转换).

重载(overload)和重写(override)是实现多态的两种主要方式

实现多态?

接口多态性
继承多态性
通过抽象类实现的多态性


实际应用

动物运动会:叫声比赛

        private void button1_Click(object sender, EventArgs e)
        {
            Cat cat = new Cat("咪咪");//声明一个Cat的对象,对象名为cat,并将此cat对象实例化

            cat.ShoutNum = 5;
            MessageBox.Show(cat.Shout());//调用猫叫的方法
        }
        private void button2_Click(object sender, EventArgs e)
        {
            Cat dog = new Cat("大黑");

            dog.ShoutNum = 5;
            MessageBox.Show(dog.Shout());
        }


        #region Cat类
        class Cat:Animal//猫类
        {
            public Cat():base()
            { }

            public Cat(string name):base(name)
            { }


            //增加了override 表示方法重写
            public override string Shout()//猫叫的方法
            {
                string result = "";
                for (int i = 0; i < shoutNum; i++)
                {
                    result += "喵 ";
                }
                return "我的名字叫" + name + "" + result;
            }
        }
        #endregion

        #region Dog类
        class Dog : Animal//类
        {
            public Dog() : base()
            { }

            public Dog(string name) : base(name)
            { }

            public override string  Shout()//狗叫的方法
            {
                string result = "";
                for (int i = 0; i < shoutNum; i++)
                {
                    result += "汪 ";
                }
                return "我的名字叫" + name + "" + result;
            }
        }
        #endregion

        #region Animal类
        class Animal
            {
                protected string name = "";//声明Animal类的受保护的字符串变量name
                public Animal(string name)
                {
                    this.name = name;//定义Animal的构造方法,参数是输入一个字符串
                }

                public Animal()
                {
                    this.name = "无名";//将构造方法重载
                }

            //默认叫的次数是3
            //ShoutNum属性,注意是public,当中有两个方法get表示外界调用时可以得到shoutNum的值
            //set表示外接调用时恶意给内部的shoutNum赋值
            protected int shoutNum = 3;
            public int ShoutNum
                {
                    get
                    {
                        return shoutNum;
                    }
                    set
                    {
                        shoutNum = value;                        
                    }
                }

            //修饰符中增加了一个virtual,它表示此方法是虚方法,可以被子类重写
            public virtual string Shout()
            {
                return "";
            }
        }
        #endregion


        //“动物报名”的按钮事件
        //声明一个动物数组
        private Animal[] arrayAnimal;
        private void button3_Click(object sender, EventArgs e)
        {
            //实例化最多可报名5个的动物数组对象
            arrayAnimal = new Animal[5];
            //报名的分别是猫,狗,狗,猫,猫
            arrayAnimal[0] = new Cat("小花");
            arrayAnimal[1] = new Dog("阿毛");
            arrayAnimal[2] = new Dog("小黑");
            arrayAnimal[3] = new Cat("大胖");
            arrayAnimal[4] = new Cat("咪咪");
        }

        //叫声比赛的按钮事件
        private void button4_Click(object sender, EventArgs e)
        {
            //遍历这个数组,让它们都Shout()
            foreach(Animal item in arrayAnimal)
            {

                //由于有了多态性,所以叫的时候,程序会自动去找item是什么对象,然后用哪个重写方法
                MessageBox.Show(item.Shout());
            }
        }
  • 35
    点赞
  • 191
    收藏
    觉得还不错? 一键收藏
  • 80
    评论
封装继承和多是面向对象编程中的三个重要概念。 封装是指将数据和对数据的操作封装在一个类中,通过访问修饰符来控制对数据的访问权限。这样可以隐藏内部实现细节,提高代码的安全性和可维护性。\[2\] 继承是指一个类可以继承另一个类的属性和方法。通过继承,子类可以重用父类的代码,并且可以在子类中添加新的属性和方法。这样可以提高代码的复用性和可扩展性。\[2\] 多是指同一个方法在不同的对象上可以有不同的行为。通过多,可以实现方法的重写和重载,使得程序可以根据对象的实际类型来调用相应的方法。这样可以提高代码的灵活性和可扩展性。\[1\] 总结起来,封装继承和多是面向对象编程的三个基本特性,它们可以使代码更加模块化、可维护和可扩展。 #### 引用[.reference_title] - *1* *2* [封装继承、多](https://blog.csdn.net/yahid/article/details/125665027)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [C++ 类的封装继承](https://blog.csdn.net/secondtonone1/article/details/124485035)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 80
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值