zoukankan      html  css  js  c++  java
  • 面向对象--3

    继承
    一、什么继承?
    1.父类的相关成员,会自动派生到子类去。public protected
    2.子类可以扩展父类的相关成员。
    3.子类可以替代父类来使用,但父类不能替代子类来使用。
    二、继承的语法:
    class 子类名:父类名
    {
        
    }
    三、继承的规则:
    (一)成员变量的继承
    1.public protected
    2.如果同名就隐藏。子类与父类各自用各自的成员。
    (二)属性的继承
    1.属性一般只有public
    2.如果同名就隐藏。子类与父类各自用各自的成员。
    (三)方法的继承
    1.public protected
    2.如果同名就隐藏。子类与父类各自用各自的成员。
    3.重写:
        a.把父类的方法设为虚方法,virtual。——父类说:这个方法可以被重写。
        b.在子类中,使用override来重写父类中的方法。——子类确认我重写这个方法。

    注意:    1.如果父类方法中没有声明virtual,子类中有override重写它。会报错。
        2.如果父类中声明了virtual,子类中没有override去重写它,不会报名,但会被隐藏。
        3.虚方法一虚到底。子类即使override父类的虚方法,子类的这个方法依然还是虚方法。

    (四)构造函数的继承
    1.如果父类没有写构造函数,或者父类构造函数没有参数。子类的构造函数没有特殊要求。
    2.如果父类的构造函数都有参数,子类构造函数必须向父类构造函数中传递值。base();

    注:在子类中调用父类的方法时,可以使用base.xxxx来调用。一般用调用父类被重写的方法。

    base--父类对象。
    this--当前对象。


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace ConsoleApplication1
    {
        class Ren
        {
            private string _Name;

            public string Name
            {
                get { return _Name; }
                set { _Name = value; }
            }
            private int _Age;

            public int Age
            {
                get { return _Age; }
                set { _Age = value; }
            }
            public virtual void Speak()
            {
                Console.WriteLine("我的名字叫:"+Name+",   今年已经"+Age+"岁了!");
            }
        }
        class Nvren:Ren
        {
            private readonly bool _Sex = false;

            public bool Sex
            {
                get { return _Sex; }
            }
            public Nvren(string name, int age)
            {
                Name = name;
                Age = age;
            }
            public override void Speak()
            {
                Console.WriteLine("我是一名女士,我的名字叫:" + Name + ",   今年已经" + Age + "岁了!");
            }
            public void Born()
            {
                Console.WriteLine("生小孩了!");
            }
        }
        class Girl : Nvren
        {
            private string _School;

            public string School
            {
                get { return _School; }
                set { _School = value; }
            }
            public Girl(string name, int age, string school):base(name,age)
            {
                //this.Name = name;
                //this.Age = age;
                this.School = school;
            }
            public override void Speak()
            {
                Console.WriteLine("我是一名女孩,正在"+School+"   读书,我的名字叫:" + Name + ",   今年已经" + Age + "岁了!");
                //base.Speak();
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                Nvren nv = new Nvren("徐丽", 22);
                nv.Speak();
                Ren r = new Ren();
                r.Speak();

                //r = nv;
                //r.Speak();
                Girl g = new Girl("徐丽",22,"江州大学");
                r = g;
                r.Speak();
                Console.ReadLine();
            }
        }
    }



    多态:不是一个新东西。主要是在继承的基础上实现出来的。
    多态分类:静态多态(编译多态),动态多态(运行多态)。
    静态多态(编译多态):方法重载来实现的。
    动态多态(运行多态):继承和重写来实现的。

    多态的实现是:父类的引用指向子类的实例。当指向不同子类的时候,父类引用调用子类方法的时候,呈现出不同的形态。

    例子:
    1.喂动物
    2.中国人、美国人、野人一起吃饭

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace ConsoleApplication1
    {
        class Human
        {
            public virtual void Eat()
            {

                Console.Write("正在吃饭:");
            }
        }
        class Chinese:Human
        {
            public override void Eat()
            {
                base.Eat();
                Console.WriteLine("在使用筷子吃饭");
            }
        }
        class American : Human
        {
            public override void Eat()
            {
                base.Eat();
                Console.WriteLine("在使用刀叉吃饭");
            }
        }
        
        class Class1
        {
            public static void Main(string[] args)
            {
                Chinese c = new Chinese();
                American a = new American();

                QingKe(c);

                
            }
            public static void QingKe(Human pengyou)
            {
                pengyou.Eat();
            }
        }
    }


    抽象类:
    对事物进行高度的抽象,抽象到一定程度,无法去具体描述。
    抽象方法:只有方法的声明,没有方法的实现。只有函数名、输入形参、返回类型,没有函数体。
    关键词:abstract
    抽象类与抽象方法的关系:
    1.含有抽象方法的类一定是抽象类
    2.抽象类不一定包括抽象方法。



    抽象类是无法被实例化的类。不能new出来。
    遇到抽象类一般来说就是两种处理思路:1.找该抽象类的派生类,使用其派生类。2.自己继承此抽象类,实现其派生类。

    对于抽象方法,子类也必须使用override来实现父类中的抽象方法。

  • 相关阅读:
    第二十一章流 1流的操作 简单
    第二十章友元类与嵌套类 1友元类 简单
    第十九章 19 利用私有继承来实现代码重用 简单
    第二十章友元类与嵌套类 2嵌套类 简单
    第十九章 8链表类Node 简单
    第二十一章流 3用cin输入 简单
    第十九章 10 图书 药品管理系统 简单
    第十九章 11图书 药品管理系统 简单
    第二十一章流 4文件的输入和输出 简单
    第十九章 12 什么时候使用私有继承,什么时候使用包含 简单
  • 原文地址:https://www.cnblogs.com/xianshui/p/4474571.html
Copyright © 2011-2022 走看看