面向对象(3)继承


一、什么继承?
1.父类的相关成员,会自动派生到子类去。public protected
2.子类可以扩展父类的相关成员。
3.子类可以替代父类来使用,但父类不能替代子类来使用。


二、继承的语法:
class 子类名:父类名
{
    
}


三、继承的规则:
(一)成员变量的继承
1.public protected
2.如果同名就隐藏。子类与父类各自用各自的成员。
(二)属性的继承
1.属性一般只有public
2.如果同名就隐藏。子类与父类各自用各自的成员。new 关键字:子类隐藏父类的同名方法,提供自己的新版本。(规范)
namespace ConsoleApplication31
{
    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 void Speak()
        {
            Console.WriteLine("我的名字叫"+_Name+",今年岁"+_Age+"了");
        }
    }
    class NvRen : Ren
    {
        private readonly bool _Sex = false;//只读字段

        public bool Sex
        {
            get { return _Sex; }
        }
       new public void Speak()         // new规范隐藏写法
        {
            Console.WriteLine("我是一个女人,名字叫"+Name+",今年"+Age+"岁");
        }

    }

    class Program
    {
        static void Main(string[] args)
        {
            NvRen n = new NvRen();    //成员变量:如果同名就隐藏。子类与父类各自用各自的成员。
            n.Speak();

            Ren r = new Ren();       //属性:如果同名就隐藏。子类与父类各自用各自的成员。
            r.Speak();

            r = n;          //输出的会是什么呢?是:  我的名字叫"+_Name+",今年岁"+_Age+"了。
            r.Speak();      //同名,被子类隐藏了

            Console.ReadLine();
        }
    }
}

(三)方法的继承
1.public protected
2.如果同名就隐藏。子类与父类各自用各自的成员。
3.重写:
    a.把父类的方法设为虚方法,virtual。——父类说:这个方法可以被重写。
        public virtual void Speak()
            {
                 Console.WriteLine("我的名字叫"+_Name+",今年岁"+_Age+"了");
            }
    b.在子类中,使用override来重写父类中的方法。——子类确认我重写这个方法。
        public override void Speak()
            {
                 Console.WriteLine("我是一个女人,名字叫" + Name + ",今年" + Age + "岁");
            }
 class Program
    {
        static void Main(string[] args)
        {
            NvRen n = new NvRen();    //成员变量:如果同名就隐藏。子类与父类各自用各自的成员。
            n.Speak();

            Ren r = new Ren();       //属性:如果同名就隐藏。子类与父类各自用各自的成员。
            r.Speak();

            r = n;          //输出的会是什么呢?
            r.Speak();      //

            Console.ReadLine();
        }
    }

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

增加一个类:
  class Girl : NvRen
    {
        private string _School;

        public string School
        {
            get { return _School; }
            set { _School = value; }
        }
        public override void Speak()
        {
            Console.WriteLine("我是一名女生,正在"+_School+"读书");
        }
    }

  class Program
    {
        static void Main(string[] args)
        {
            NvRen n = new NvRen();    //成员变量:如果同名就隐藏。子类与父类各自用各自的成员。
            n.Speak();

            Ren r = new Ren();       //属性:如果同名就隐藏。子类与父类各自用各自的成员。
            r.Speak();

            Girl g = new Girl();

            r = g;          //输出的会是什么呢?
            r.Speak();      //

            Console.ReadLine();
        }
    }
}


(四)构造函数的继承
1.如果父类没有写构造函数,或者父类构造函数没有参数。子类的构造函数没有特殊要求。
2.如果父类的构造函数(构造函数可能有好几个)都有参数,子类构造函数必须向父类构造函数中传递值。base();
   public NvRen(string name, int age) : base(name, age)
        {

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

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

posted @ 2015-04-29 14:24  指尖的人生  阅读(182)  评论(0编辑  收藏  举报