面向对象之继承(类与类之间的关系)

 

继承:类与类之间的关系(父子关系)
子类继承父类,那么子类就拥有父类的公共属性和方法
一个子类只能继承一个父类,一个父类可以有好多子类
子类对象可以直接转成父类,但父类只能转回对应的子类
如果子类转成父类之后,父类对象就不能点出子类里面的属性和方法使用了

c#允许一个类继承其他类的属性和方法,别继承的类称为父类,继承的类称为派生类或子类。子类不仅仅可以继承基类的属性和方法,还可以根据需要定义新的属性和方法,增加新的功能,这样可是用户重用基类的代码,专注于子类的新代码,提高类的可重用性,继承的好处是能共享代码,继承后,父类的所有的字段和方法都将存在于子类中,每一个子类都具有父类的非私有特性。

Object类是所有类的祖先(默认的)

c#语言中子类仅能派生于一个父类。

1.继承的定义

如果要声明一个类派生于另一个类,可以使用下面的语法

[修饰符]  class  派生类名:基类名

{

                        //派生类的成员

}

其中:

   修饰符:可选用poublic    internal      absrtract     sealed   new     private    protected等修饰符,根据需要确定。

   派生类名:必须是一个有效的c#标识符。一般采用Pascal大小写命名规则,单词的第一个字母大写。

   基类名:被继承的类的名。

   类体:用于定义派生类的成员。

   继承意味着一个类隐藏了除了构造函数和析构函数的基类的所有成员。

继承应该注意的几点

《1》继承是可以传递的。

《2》派生类应当是对基类的扩展。派生类可以添加新的成员,但不能除去基类的成员的定义。

《3》析构函数和构造函数不能参与被继承,除此之外的其他任何成员都能被继承。

《4》派生类如果定义了与继承而来的成员同名的新成员,都将覆盖以继承的成员。但这并不是在派生类中删除了这些成员,而只是不能再访问这些成员。

《5》类可以定义虚方法、虚属性以及虚索引指示器,他的派生类都能够重载这些成员。从而实现类的多态性。

《6》派生类的成员有两个成员:一个是从基类中继承来的,另一个是在派生类中重新定义的。

案例如下

using  system;

namespace  Example1

              //定义基类

              public  class  Person

              {

                         protected    string   name ;           //姓名  保护成员

                         protected    string   indentityCard;                    //身份证号  

                          Private        string    tel;                                        //电话号码  私有成员

                          public  Person (string   P_name ,string  P_identityCard,string   P_tel)                   //构造函数

                           {

                                             name =  P_name ;

                                             indentityCard= P_identityCard;

                                              tel=P_tel;

                             }

                            public  void  PrintInfo()

                             {

                                                 Console.WriteLine("姓名:{0}",name);

                                                 Console.WriteLine("身份证号:{0}",identityCard);

                              }

                 }

            //定义派生类

            public   class  Employee:Person

            {

                       public   string    id;  //在派生类中添加雇员的编号  公共成员

                       public   Employee(string P_name,string  P_identityCard,string   P_tel,string   e_id):base(  P_name ,  P_identityCard,  P_tel)  //构造函数

                         {

                                                    id=e_id;

                          }

                           public    void  PrintEmployeeInfo()      //雇员信息打印

                           {

                                     Console.WriteLine("姓名:{0}",name);

                                      Console.WriteLine("身份证号:{0}",identityCard);

                                      Console.WriteLine("雇员 :{0}",id);

                            }

                     }

  class  Class1

    {

                   [STAThread]

                   static    void    Main(string[]  args)

                   {

                                    //用类派生创建对象

                                    Employee   liming=new  Employee("liming","370321012950020","8505085"   ,"8888");

                                    //调用PrintEmployeeInfo() 方法

                                    Console.WriteLine("调用PrintEmployeeInfo()方法");

                                     liming.PrintEmployeeInfo();

                                  //调用PrintInfo()方法,继承而来

                                   Console.WriteLine("调用PrintInfo()方法");

                                     liming.PrintInfo();            

 

                   }       

             }

}

程序运行结果:

            调用PrintEmployeeInfo()方法

             姓名:linming

             身份证号:  370321012950020

            调用PrintInfo()方法 

            姓名:liming

            身份证号: 370321012950020

解析程序:

     《1》这里面要注意一点,基类中的tel定义的是私有成员,在我们继承的时候是可以继承的,但是我们这里是不能访问的。

     《2》当我们实例化子类的时候我们就调用基类,所以初始化的同时也对基类进行了初始化。

派生类的构造函数

定义派生类的构造函数

[修饰符]   派生类类名(参数列表1):base(参数2)

{

                          //派生类初始化代码

}

修饰符:可以是public    pirvate  static

派生类名:构造函数所在的类名

参数列表1:指明参数的名称和类型,包含派生类新增参数及基类中的参数,也可以无参数。

base:基类关键字表示基类,关键字base为调用基类成员提供了一个简便的方法,调用基类成员的格式为base.成员名。

    当我们实例化时就不需要带上base这个关键字了。

使用new修饰符隐藏基类的成员

使用new修饰符可以显示隐藏从基类继承的成员,这样在使用派生类的对象的方法时,调用的是派生类重写的与派生类的新方法。

例题

  public   class  MyBase

{

                public   int    x;

                 public  void   MyVoke()

                  {

                                      Console.WriteLine("this   is    MyBase");

                   }

}

在派生中使用MyVoke名称声明成员会隐藏基类中的MyVoke方法,即:

public  class  MyDerived:MyBase

{

                new   public   void   MyVoke()

                 {

                             Console.WriteLine("this    is    MyDerived");

                     }

}

这样我们就隐藏基类的方法了,但我们调用基类的方法的时候就采用:base.基类隐藏的方法;

密封类和密封方法

但我们需要把一个单独的类分开,来实现莫中特定的功能的时候,而不希望他有所继承和重写,我们就需要将这个类密封起来,

命令格式如下:

  sealed   class   FinalClass

{

                        //代码

}

抽象类和抽象函数

c#允许把类和函数声明为abstract,抽象类不能实例化,而抽象类函数没有执行代码,函数括号后跟一个分号,必须在非抽象类中重写,如果类包含抽象函数,该类也是抽象类的,必须声明为抽象的:

abstract   class   Building

{

    public  abstract  decimal  CalcudateHeatingCost(); //抽象的方法

}

         

posted @ 2015-08-25 15:00  Franky2015  阅读(1317)  评论(0编辑  收藏  举报