c# 面相对象3-之继承性

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

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(); //抽象的方法

}

时间: 2024-10-24 14:34:26

c# 面相对象3-之继承性的相关文章

js编程-面相对象

//js面相对象编程 //定义constructor构造方法 function myFn(name,sex){ this.name = name; this.sex = sex; } //用prototype追加属性方法 myFn.prototype.getName = function(inter){ console.log(this.name); console.log("兴趣:" + inter); return this.name; } //实例化myFn var newMy

8.python之面相对象part.6(反射&__call__,__setattr__,__delattr__,__getattr__)

一.什么是反射? 反射,又被称为自省,主要是指程序本身可以访问,检测,和修改"自己",状态或行为的一种能力. 二.python是如何体现这种反射机制的? 通过字符串去操作对象相关的属性,python中,一切皆对象,所有的地方都可以用到反射. python内部提供了四个实现反射(自省)的函数,这四个函数可以适用于任何的类和对象(这是因为类本身也是一个对象!) 1.hasattr(object,str) 用来检测一个对象中是否有某个字符串对应的方法或者属性. 例如: l1 = [] pri

文成小盆友python-num7 -常用模块补充 ,python 牛逼的面相对象

本篇内容: 常用模块的补充 python面相对象 一.常用模块补充 1.configparser模块 configparser 用于处理特定格式的文件,起内部是调用open()来实现的,他的使用场景是操作特定格式的文件. 特定的格式如下: # [section1] #节点名称 k1 = v1 #值1 k2 = v2 #值2 [section2] #节点名称 k1 = v1 #值 获取文件中的所有节点 ##configparser 模块使用 #1.获取所有的节点 import configpars

c# 面相对象2-之封装性

c# 面相对象2-之封装性 一.封装特性: 这是一种隐藏的特性.可以用一个公式来展示类的封装特性: 封装的类=数据  +  对此数据进行的操作(即算法) 通俗的说,封装就是:包起外界不必要知道的东西,只向外界展露可供展示的东西. 在面向对象理论中,封装这个概念拥有更为宽广的含义.小到一个简单的数据结构,大到一个完成的软件子系统,静态的如某个软件系统要收集数据信息项,动态的如某个工作处理的流程,都可以封装到一个类中. 具备这种封装的意识,是掌握面向对象分析与设计技巧的关键 二.类的成员: 成员变量

php对象中类的继承性访问类型控制

类型的访问控制通过使用修饰符允许开发人员对类中成员的访问进行限制.这是PHP5的新特性,也是OOP语言中的重要特性,大多数OOP语言都已支持此特性.PHP5支持如下三种访问修饰符,在类的封装中我们已经介绍过了两种.在这里总结一下,访问控制修饰符包括public(公有的.默认的).privat(私有的)和protected(受保护的)三种哦.他们的作用及其之间的区别如下表所示: ①公有的访问修饰符public 使用这种修饰符则类中的成员将没有访问限制,所有的外部成员都可以访问这个类中的成员,在PH

递归函数、二分查找、面相对象初识、类空间,对象空间、组合、继承

一.递归函数 一般递归100多次,都没有解决的问题,放弃递归. 默认递归深度:998 修改默认递归次数 import sys sys.setrecursionlimit(100000) #设置十万次 count = 0 def func1(): global count count += 1 print(count) func1() func1() 用递归 解决一个年龄问题. alex 他比佩奇 大两岁.  4   age(3) + 2 佩奇 他比日天 大两岁.  3   age(2) + 2

面相对象初始

一.初始面向对象 面向对象的程序的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可. 缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身. 应用场景:一旦完成基本很少改变的场景,著名的例子有Linux内核, git,以及Apach,HTTP,Server等. 面相对象的程序设计的核心是对象(上帝式思维),要理解对象为何物,必须把自己当

面相对象7大原则

1.单一职责原则 每个类应该专注于做一件事情. 2.里氏替换原则 超类存在的地方,子类是可以替换的. 3.依赖倒置原则 实现尽量依赖抽象,不依赖具体实现 4.接口隔离原则 应当为客户端提供尽可能小的单独的接口,而不是提供大的总的接口 5.迪米特法则 又叫最少知识原则,一个软件实体应当尽可能少的与其他实体发生相互作用 6.开闭原则 面相扩展开放,面相修改关闭 7.组合/聚合复用原则 尽量使用合成/聚合达到复用,尽量少用继承.原则:一个类中有另一个类的对象

程序设计方法概述:从面相对象到面向功能到面向对象

1. 面向功能的程序设计方法.结构化程序设计方法.面向数据流的处理方式与结构化分析(Structrued Analysis,即SA).结构化编程(Structrued Program,即SP).结构化设计    (Structrued Design,即SD) 结构化程序设计方法主张按功能来分析系统需求,其主要原则可概括为自顶向下,逐步求精,模块化等.结构化程序设计首先采用结构化分析(Structrued Analysis,即SA)方法对系统进行需求分析,然后使用结构化设计(Structrued