基类类面向对象之封装、继承、多态
本篇文章笔者在上海喝咖啡的时候突然想到的...今天就有想写几篇关于基类类的博客,所以回家到之后就奋笔疾书的写出来发布了
封装、继承、多态
继承:
1、C#语言供给两种继承的方法:实现继承(只能单一继承)和接口继承(可以多继承)
例子:有一个Employee类,有以下4个属性和3个方法
类名:Employee
成员变量:
-CompanyName:string(公司名称)
-EmployeeID:int(员工编号)
-EmployeeName:string(员工姓名)
-EmployeeSalary:string(员工工资)
方法:
+SetID(in ID:String):void
+GetID():string
+SetCompanyName(in CompantName:String):void
----注释:
成员变量:-CompanyName:string字符串类型,“-”表示private访问修饰符,成员变量下方 加底线表示static
方法:+SetID(in ID:String):void in 表示输入参数 void表示不返回值,有下划线表示static
子类不能继承父类的构造函数和析构函数。
继承默认是public
2、Base:代表基类中调用父类的构造函数,注意,这个构造函数的的参数个数和类型必须和基类中某一个构造函数一样。Base的另外用法是调用基类的成员(成员方法),如:
父类:
namespace ClassTest
{
public class Employ
{
public Employ(string EmployeeNum)
{ }
private string employeeNum;//员工编号
public void SetEmployeeID(string EmployeeNum) //设置员工编号
{
employeeNum = EmployeeNum;
}
}
}
子类:
namespace ClassTest
{
public class U_base:Employ
{
public U_base(string EmployeeNum)
: base(EmployeeNum) //base指基类中的构造函数,参数类型和个数必须雷同
{
base.SetEmployeeID(EmployeeNum); //这里的base是用于调用基类中的成员方法
}
}
}
3、基类重写override父类方法,这是多态的一种表现形式,是对基类中的方法停止重新定义。方法名以及参数和基类中的雷同,只是方法外部代码不同。(重载是统一个类中的统一种方法的返回值可以雷同,也可以不同,是一个类中多态的一种表现,参数不同)
4、虚拟方法
体现多态。一个类中默认的方法都是非虚拟的,不允许在统一个类中用雷同的方法去实现不同的功能
虚拟方法弗成以是静态的。因为静态方法是类级别的,而多态只能体现在对象级别。
Virtual不能用private修饰,否则没法再子类中重写。
Virtual方法可以有详细的实现,而abstract方法不能有详细的实现,abstract方法必须在子类中用override来实现。
基类中的Virtual方法被子类中的override重写是,方法的修饰符(不存在修饰符权限大小问题,必须雷同)、名称、参数、返回值必须雷同。
Virtual和override不能同时使用,因为override方法是隐含virtual的。
override不能和private、static一起使用,因为静态方法是类级别的,而多态只能体现在对象级别;override方法必需要改写virtual方法,若设置为private就不能改了。
virtual用来修改基类的方法或属性的定义部份。虚拟成员或虚拟函数可以在子类中改写其功能。Virtual用于基类中。Virtual方法可以被实例化成员调用。
详细用法是在基类中定义virtual方法,然后根据需要在子类中重写override功能,没有用virtual声明的方法不能用override重写,否则犯错。
若基类和子类中有雷同的方法,那么基类的方法被子类覆盖,基类能够调用自己的该方法,子类调用的该方法是子类自己的该方法。
注意:不论是基类中的virtual还是子类中的override方法,都能被各自的类调用。
5、final最终类不允许继承,里头的方法不允许override
6、new关键字
在子类中定义方法用以代替基类中的方法,但是基类中的该方法还是能够被基类的实例调用,而不能被子类实例使用了。子类中用new修饰的方法只能用子类的实例调用。使用new和在子类中直接定义一个和基类中的方法雷同的方法的效果是一样的,不过这样会有警告。
7、sealed类(例如enum、String)和sealed方法
Sealed类防止类被继承,也就是说sealed类不能作为基类。Sealed方法不能被override重写
8、C#中允许将基类的类型指针指向子类:B:A{…} A a=new A();B b=new B();A c=b;这里的c是A的实例,若c.方法名(),则调用的是A中的方法。当然,若A中有virtual方法,那么A c=b就会先调用A,然后发现A中的方法用virtual修饰,会进一步检测B中的方法,若B类中的方法被virtual修饰,则A、B中的方法不相关,若B中的方法用new修饰,标明这是一个新的方法,,最终调用的是还是A中的方法。若B中的方法用override修饰,标明这是一个新的方法,,最终调用的是还是B中的方法。
9、接口
为了到达抽象化,需要在功能的定义和使用之间供给一种公共的标准,以便供给者和用户都能够按照标准停止操纵。这样的标准就是接口。接口只是定义了标准,没有详细的实现(抽象类可以有详细的实现),接口支持多继承,类支持单继承。接口中定义的方法不能包括区块内容,也就是说不应该有大括号:public interface Job{double C(){}};这是错误的,定义在接口中的方法隐含都是public,若定义的时候再加上public就会报错啊。类一旦继承了接口,就应该实现接口中的所有方法,而且实现时要和接口中该方法完全雷同(修饰符、返回值、方法名称、参数),继承自接口的方法可以用virtual关键字修饰,用于自他类继承。但是接口中的方法不能用virtual,也不能有修饰符。
10、抽象类、抽象方法
抽象类和接口一样不能实例化。抽象方法隐含是virtual的,所以不能和virtual连用。抽象方法只能定义在抽象类中。抽象方法只能由定义部份,不能有大括号,抽象方法一定要在子类中实现。和接口相似,抽象方法和virtual修饰的方法的区别是virtual可以有实现部份,即大括号。抽象类可以继承自非抽象类、抽象类。
抽象类和接口都不能使用sealed修饰,接口中不能包括抽象方法,抽象方法中可以使用ovreride、new修饰符
文章结束给大家分享下程序员的一些笑话语录:
话剧:程序员过沟
本剧内容纯属虚构,如有雷同……HEHE……俺也没办法了。
话说某市街道改建,某某软件公司门口横七竖八挖了几条大沟。一群程序员(SDK程序员赵某,VB程序员钱某,VC程序员孙某,DELPHI程序员李某)下班从公司里出来,看到门前的几条沟,于是各显神通……门前第一条沟也就半米来宽,SDK程序员赵某二话没说,轻轻一跃跳了过去,看到其它人纷纷把随身携带的公文包(类库)横在沟上踩着过沟,不屑地说,这么小一条沟,犯得着小题大做用那个吗?看我多么轻松多么洒脱多么……多么……(众人皆怒目横视之……)
接着第二条沟有点宽度。SDK程序员赵某还是还是一马当先,飞跃而起……不好,还差一点才到……幸好凭着多年的(跳远?编程?)经验,单手抓住沟沿,颤巍巍地爬了上来,嘴里还念念有词“高手就是高手啊,虽然差一点就……不过毕竟……HEHE……跳远是过沟的基础嘛,有基础(SDK)就有一切的说……”(众人作瞠目结舌状……)看到别人跳过去了,可自己又跳不了那么远,只好再想办法了……VB程序员钱某,DELPHI程序员李某打开手提,连上手机,开始上网找可供过沟的控件……VC程序员孙某却不慌不忙,打开公文包,把几块衬板拆了下来,然后三下五除二拼成一个简易木桥……“虽然这几个板子(类)做得不怎么样,不过先把这个项目应付过去,有时间我自己做一个好了……”于是踩着板子过了沟。
这时钱某和李某也分别找到了合适的东东。钱某找到的是“钢丝绳.ocx”,安装简单,使用方便,拉出一头,对孙某说“大虾,顺手拉兄弟一把……”,于是把绳子系在沟两边的绿化树木上,踩着钢丝就过了沟。刚刚站稳就四方作揖,“小生这里有礼了”。这时一戴着黄袖圈的老太太跳了出来,抓住钱某,“破坏绿化树木,罚款XXXX元,交钱,交钱,交钱!”(老人家作双枪老太婆怒视伪军状
……钱某被逼无奈,只好边掏钱,边对着后台叫道“导演,我这可是因公牺牲,不给个烈士称号也得报销”,后台一个臭鸡蛋飞出,“叫什么叫,我这个月的粮饷还不知哪里去领呢,都什么时代了,你不下岗都不错了……”)
李某看着刚刚好不容易从台湾拖回来的“铝条.ZIP”
---------------------------------
原创文章 By
基类和类
---------------------------------