zoukankan      html  css  js  c++  java
  • 面向对象基础

      面向对象三大特性:封装、继承和多态。

    一、封装

      封装:

        每个对象都包含它能进行操作所需要的所有信息,这个特性称为封装,因此对象不必依赖其他对象来完成自己的操作。

      封装的好处:

        1、良好的封装能够减少耦合。

        2、类内部的实现可以自由地更改。

        3、类具有清晰的对外接口。

    二、继承

      对象的继承代表了一种"is-a"的关系,如果两个对象A和B,可以描述为"B是A",则表明B可以继承A。继承者还可以理解为是对被继承者的特殊化,因为它除了具备被继承者的特性外,还具备自己独有的个性。

      继承常用与提炼出相同的特性,放于父类,起到减少代码重复的作用。

      继承定义了类如何相互关联,共享特性。继承的工作方式是,定义父类和子类,或叫做基类和派生类,其中子类继承父类的所有特性。子类不但继承了父类的所有特性,还可以定义为新的特性。

      如果子类继承与父类。第一、子类拥有父类非private的属性和功能;第二、子类具有自己的属性和功能,即子类可以扩展父类没有的属性和功能;第三,子类还可以以自己的方式实现父类的功能(方法重写)。

      子类可以从父类中继承的成员有方法、域、属性、事件、索引指示器,但对于构造方法不能被继承,只能被调用。对于调用父类的成员,可以使用base关键字。

      如果不使用继承,如果要修改功能,那么就必须在所有的重复的方法中修改,代码越多,出错的可能就越大,而继承的优点是,继承使得所有子类公共的部分都放在了父类,使得代码得到了共享,这就避免了重复,另外,继承可使得修改或扩展继承而来的实现都较为容易。

      继承也是有缺点的,如父类变,子类不得不变。继承是一种类与类之间强耦合关系。只有当两个类之间具备“is-a”的关系时,就可以考虑用继承了。

    三、多态

      多态表示不同的对象可以执行相同的动作,但要通过他们自己的实现代码来执行。

      1、子类以父类的身份出现。

      2、子类在工作时以自己的方式(代码)来实现。

      3、子类以父类的身份出现时,子类特有的属性和方法不可以使用。

      为了使子类的实例完全解体来自父类的类成员,父类必须将该成员声明为虚拟的。这是通过在该成员的返回类型之间virtual关键字来实现。除了字段不能为虚拟的之外,其他的属性、事件、索引器都可以使虚拟的

      抽象类abstract,抽象的东西要求在子类中必须被重写。这也是与virtual不同的地方。抽象类不能实例化。如果类中包含抽象方法,那么类就必须定义为抽象类。

      子类可以选择使用override关键字,将父类实现替换为它自己的实现,这就是方法重写override,或者叫做方法覆写。

      多态的原理是当方法被调用时,无论对象是否被转换为其父类,都只有位于对象继承链最末端的方法实现会被调用。也就是说,虚方法是按照其运行时类型而非被编译时类型进行动态绑定调用的。

    namespace ConsoleApplication1
    {
        abstract class Animal
        {
            protected string name;
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
    
            public Animal(string name)
            {
                this.name = name;
            }
    
            public void SayMyName()  //公用的东西,提取出来,更改的时候,只需更改父类,子类就全部改了
            {
                Console.WriteLine("我的名字叫做" + name);
            }
    
            public abstract void Shout();
        }
    
        class Dog : Animal  //继承自Animal,其中Animal中是动物的共有的特性,因此狗也能继承得到,例如名字
        {
             public Dog(string name) : base(name) //构造函数,new的同时为父类的name赋值
             { }
    
             public override void Shout()   //封装,将狗会叫特性放在类里面,其他还有狗的林林种种都可以放入该类。
             {
                Console.WriteLine("汪汪汪");
             }
        }
    
        class Cat : Animal
        {
            public Cat(string name) : base(name) //构造函数,new的同时为父类的name赋值
             { }
    
            public override void Shout()
            {
                Console.WriteLine("喵喵喵");
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                Animal a1 = new Dog("旺财");  //多态,子类以父类的身份出现
                a1.Shout();     //输出 汪汪汪    //调用方法时,先检查子类又没有对应的方法,没有在向父类检查,如此类推。
                a1.SayMyName(); //输出 我的名字叫旺财
    
                Animal a2 = new Cat("猫咪");
                a2.Shout();     //输出 喵喵喵
                a2.SayMyName(); //输出 我的名字叫猫咪   
    
                Console.ReadKey();
            }
        }  
    }
  • 相关阅读:
    实现三栏布局
    Element对象
    React中组件间通信的方式
    CSS实现展开动画
    Vue中组件间通信的方式
    java面试一日一题:mysql执行delete数据真的被删除了吗
    java面试一日一题:讲对mysql的MVCC的理解
    java面试一日一题:讲下mysql中的锁
    java面试一日一题:如何优化sql
    java面试一日一题:在创建微服务时,是用RPC还是http
  • 原文地址:https://www.cnblogs.com/kissdodog/p/2979650.html
Copyright © 2011-2022 走看看