封装、继承、多态
继承:
1、C#语言提供两种继承的方式:实现继承(只能单一继承)和接口继承(可以多继承)
例子:有一个Employee类,有以下4个属性和3个方法
类名:Employee
成员变量:
-CompanyName:string(公司名称)
-EmployeeID:int(员工编号)
+GetID():string
+SetCompanyName(in CompantName:String):void
方法:+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
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修饰符
继承:
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修饰符