C#学习笔记06:类继承

1、概念:

   父类,基类

  Person:pid,pname,pbirth,….

  子类、派生类

    Student:继承Person属性和方法,扩展一些自己属性和函数:sno,sdept,smajor,…

Employee: 继承Person属性和方法

Teacher: 继承Person属性和方法

 图形类Shape:求周长、求面积函数。  抽象父(基)类

 三角形类:继承图形类

 矩形类: 继承图形类

 圆类:继承图形类

窗口类:

   登陆窗口类:窗口类

   注册窗口类:窗口类

2、c#继承语法

  父类

  class Person

{

     ….

   }

   class Student:Person

{

     …

   }

子类从父类继承什么?子类从父类继承public,protected部分成员:属性和方法。

  Student s1 = new Student();

3、继承构造函数

   当子类对象实例化,首先自动父类的构造函数,然后才调用自己本身构造函数。当父类构造函数需要参数时,子类构造函数如何定义?

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ex2013_07_22

{

    class Person

    {

        private string pid, pname, pbirth;

        

        public Person()

        {

            Console.WriteLine("Person()");

        }

        public Person(string pid, string pname, string pbirth)

        {

            this.pid = pid; this.pname=pname; this.pbirth = pbirth;

        }

    }

    class Student : Person

    {

        private string sno, sdept;

        public Student():base()

        {

            Console.WriteLine("Student()");

        }

        public Student(string pid, string pname, string pbirth,

            string sno,string sdept):base(pid,pname,pbirth)

        {

            this.sno = sno; this.sdept = sdept;

        }

    }

    class Ex1_1

    {

        

        static void Main(string[] args)

        {

            Student s = new Student("1","zhou","1990-1-1","2010001","math");

            Person p = new Person();

            Console.ReadLine();

        }

    }

}

4、函数覆盖问题

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ex2013_07_22

{

    class Person

    {

        private string pid, pname, pbirth;

        

        public Person()

        {

            Console.WriteLine("Person()");

        }

        public Person(string pid, string pname, string pbirth)

        {

            this.pid = pid; this.pname=pname; this.pbirth = pbirth;

        }

        public void Disp()

        {

            Console.WriteLine(pid+" "+pname+" "+pbirth);

        }

    }

    class Student : Person

    {

        private string sno, sdept;

        public Student():base()

        {

            Console.WriteLine("Student()");

        }

        public Student(string pid, string pname, string pbirth,

            string sno,string sdept):base(pid,pname,pbirth)

        {

            this.sno = sno; this.sdept = sdept;

        }

        public void Disp()

        {

            base.Disp();//调用父类函数或属性

            Console.WriteLine(sno + " " + sdept);

        }

    }

    class Ex1_1

    {

        

        static void Main(string[] args)

        {

            Student s = new Student("1","zhou","1990-1-1","2010001","math");

            s.Disp();

            Console.ReadLine();

        }

    }

}

子类实例未将函数覆盖。

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ex2013_07_22

{

    class Person

    {

        private string pid, pname, pbirth;

        

        public Person()

        {

            Console.WriteLine("Person()");

        }

        public Person(string pid, string pname, string pbirth)

        {

            this.pid = pid; this.pname=pname; this.pbirth = pbirth;

        }

        public  void Disp()

        {

            Console.WriteLine(pid+" "+pname+" "+pbirth);

        }

    }

    class Student : Person

    {

        private string sno, sdept;

        public Student():base()

        {

            Console.WriteLine("Student()");

        }

        public Student(string pid, string pname, string pbirth,

            string sno,string sdept):base(pid,pname,pbirth)

        {

            this.sno = sno; this.sdept = sdept;

        }

        public  void Disp()

        {

            Console.WriteLine(sno + " " + sdept);

        }

    }

    class Ex1_1

    {

        

        static void Main(string[] args)

        {

            //父类对象引用子类实例

            Person p = 

                new Student("1","zhou","1990-1-1","2010001","math");

            p.Disp();

            //

            Console.ReadLine();

        }

    }

}

 虚函数及覆盖问题:

 virtual,overide

在父类函数中定义virtual函数,允许子类覆盖该函数,子类使用overide对虚函数覆盖。实现动态绑定,当父类对象引用子类实例时,子类实例函数上传到父类实例将父类虚函数覆盖。

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ex2013_07_22

{

    class Person

    {

        private string pid, pname, pbirth;

        

        public Person()

        {

            Console.WriteLine("Person()");

        }

        public Person(string pid, string pname, string pbirth)

        {

            this.pid = pid; this.pname=pname; this.pbirth = pbirth;

        }

        public virtual void Disp()

        {

            Console.WriteLine(pid+" "+pname+" "+pbirth);

        }

    }

    class Student : Person

    {

        private string sno, sdept;

        public Student():base()

        {

            Console.WriteLine("Student()");

        }

        public Student(string pid, string pname, string pbirth,

            string sno,string sdept):base(pid,pname,pbirth)

        {

            this.sno = sno; this.sdept = sdept;

        }

        public override void Disp()

        {

            Console.WriteLine(sno + " " + sdept);

        }

    }

    class Ex1_1

    {

        

        static void Main(string[] args)

        {

            //父类对象引用子类实例

            Person p = new Student("1","zhou","1990-1-1","2010001","math");

            p.Disp();

           Console.ReadLine();

        }

    }

}

5、抽象函数与抽象类

抽象函数是指没有实现(即没有函数体),只有声明。

当一个类包含抽象函数时,该类必须定义为抽象类。抽象类不能实例化,只能作为其他类的父类,抽象基类。

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ex2013_07_22

{

    abstract class Shape

    {

        public abstract double area();

        public void dispArea()

        {

            Console.WriteLine(area());

        }

    }

    class Rect : Shape

    {

        private int w, h;

        public Rect(int w,int h)

        {

            this.w = w; this.h = h;

        }

        public override double area()

        {

            return w * h;

        }

    }

    class Circle : Shape

    {

        private int r;

        public Circle(int r)

        {

            this.r = r;

        }

        public override double area()

        {

            return Math.PI*r*r;

        }

    }

    class Ex1_1

    {

        

        static void Main(string[] args)

        {

            Shape shape = new Rect(2, 4);

            shape.dispArea();

            shape = new Circle(5);

            shape.dispArea();

            Console.ReadLine();

        }

    }

}

本章练习题下载地址:点此下载


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值