继承与多态(六)
继承
1.继承
a。.直接在类的后面加上冒号“:”后面跟基类,就该类就继承了基类的一切特性了。
b。private类不能被继承,只有public、protected类能被继承。
c。private类不里面所有的属性和方法都不能被外界访问,只有他自己可以。
d。public类可以被外界访问和继承。
e。protected类可以被继承,外界不能访问,但是子类可以访问。
f。c#不能多重继承,就是说一个类只能继承一个类,不能同时继承多个类。要实现多继承就需要用接口来实现。
g.对于继承来说。不允许派生类的访问性比其基类的更高。也就是说,内部类可以继承于一个公共类,但公共类不能继承一个内部类。
注:1.访问性相同的类,可以相互继承。
2.系统默认的是内部类(interior关键字修饰),所以我们在定义基类时,需要加上public或protected
h.如果指定了基类,它必须紧跟在继承类冒号的后面,之后才是指定的接口。如果没有指定基类,则接口就跟在冒号的后面。
注:如果一个类即实现某个接口又继承某个类,那么所继承的类的类名要写在最前面,接口跟在继承类的后面,如:public class 普通类:基类名,接口1,接口2
不能写成public class 普通类:接口1,基类名,接口2
2.多态(覆载)
多态是指两个或多个属于不同类的对象,对同一个消息做出不同的响应的能力。
实现多态时必须在将该方法定义成虚函数,用virtual定义虚函数。在重写虚函数时还要在重写的前面加上override(覆载)来申明一个覆载方法,然后用base关键字来告诉程序方法是基类的方法。
public class person
{
private string name;
private string adress;
//这里和继承哪里的一样,这里就省了
public virtual void print()//用virtual将print()方法定义为虚方法(虚函数);
{
3行: Console.WriteLine("姓名: " + Name + "\n" + "地址" + Adress);
}
}
public class Student:person
{
private string studentId;//定义一个字段
//这里是studentId的访问器,此处忽略
public override void print()//用override来重写一个方法
// public new void print() //用new来防止隐藏了父类的方法,但注意的是在客户端需要用基类的类名来实例化子类的对象。
{
2行: base.print(); //用base关键字来告诉程序这里的print()是基类中的,当前这个print()
4行: Console.WriteLine("学号" + StudenId+"\n");
}
}
class Program
{
static void
{
Student s = new Student();
s.Name = "报文";
s.Adress = "云南农业大学";
1行: s.print();//调用自己类中的方法
/* //用基类名来实例化子类。如果调用了子类中用new方法的话,那么就不会覆盖基类中的方法。
Person p=new Program();
p.print();
*/
Console.Read();
}
}
步骤说明:执行到第1行时,当然是先调用自己类中的东西,如果自己类中没有,然后才会到基类中去找的,所以执行第1行后他调用了自己类中的print(),然后执行第2行,第2行调用基类中的print(),调用完后回来继续执行第4行。
说明:基类中有一个print()方法,子类中也有一个print()方法,在基类方法前面加上virtual表示定义了一个虚方法,然后在子类中通过override来覆载基类中的print()方法,这也就是重写了。然后通过base来调用基类中的print()。
注:1.通过这样的方式就可以省去既要调用基类中的方法又要调用自己类中的方法,如果子类中的方法只是想在基类的方法中扩大或缩小或其他一些和基类中的方法有关的操作就不用重新再定义了。
如,基类中的方法是Num(){ return 3 ;} 在子类中的Num(){ return base.Num()*3}
就不在重新写了,直接改变调用基类中的方法来改变。
2.在重写方法或属性的前面加override是覆载基类的方法或属性,如果用new的话,然后在创建对象时用基类来创建子类的对象,那么基类中的方法或属性就不会被覆盖掉。