1 多态
多态是指两个或多个属于不同类的对象,对于同一个消息(方法调用)作出不同响应的方式。 一个基类的引用符,可以指向多种派生类对象,具有多种不同的形态,这种现象叫多态性。
2 虚方法-重写
同样都是继承了同一个父类,但是父类中的方法并不适用任何一个子类,那么在这就需要子类重新编写这个方法的主体。
所有的类都可以当做父类,都可以有虚方法。Override 是对父类的方法进行实现,这个“重新设计”的的基础是方法名和参数完全一致,但是内部实现体不一样。
方法重写的条件:
A、方法必须一样
B、override方法和 virtual方法具有相同的访问级别修饰符,访问修饰符允许被放大。
C、返回类型必须一样
步骤:
(1)需要父类同意子类可以重新编写自己的方法 ( virtual - 虚方法)
访问修饰符 virtual 返回类型 方法()
{
//方法体
}
(2)子类只能重写父类允许重写的方法,只能重写虚方法(override - 重写)
访问修饰符 override 返回类型 方法()
{
//方法体
}
例如:
//父类Fly
public virtual string fly1()
{
return "我会飞!";
}
//子类a
public override string fly1()
{
return "我有翅膀!";
}
//主函数
a cs1 = new a();
Console.WriteLine(cs1.fly1());
3 抽象类abstract
抽象类本身无法产生实例对象,而且抽象类包含了一个以上的抽象方法,这些方法只是提供函数名称,并没有定义如何具体实现,由继承的派生类实现,
派生类同时必须实现所有抽象类的方法,否则其本身将成为另外一个抽象类。
需要我们注意的一点是,当派生类重写抽象类的方法时,要使用override关键字来重写抽象类所定义的方法
抽象类只能被继承,不能被实例化,抽象类的抽象方法是虚方法。
有抽象方法的类,一定是抽象类;抽象类中不一定只有抽象方法。
//父类-抽象类
public abstract class cx
{
public abstract string ren();
}
//子类
public class cx1:cx
{
public override string ren()
{
return "人";
}
}
4 接口interface
接口实际上就是一个类,只是这个类只声明成员,而不具体实现。故不能创建接口的实例,继承自接口的类必须实现接口的所有方法。接口也能很好的体现多态性,当函数中参数类型为基接口时,则不管是什么类,只要这个类继承于基接口,均可以根据实例化情况来调用。
(1)接口、抽象类的相似之处和不同:
接口和抽象类均不能实例化,而且要求派生类实现其抽象方法,但不是必须全部实现。
但抽象类有更多的功能:可以由子类继承,而且可以包括状态数据和具体方法。
(2)接口和类的区别:
接口不能从类继承,而类可以实现接口(继承接口);
接口可以继承多个接口,而类虽然可以继承多个接口,却只能继承一个类。
接口成员必须是方法、成员属性、事件或索引器。(注意无数据成员)
所有接口成员必须能公开访问。
//接口
public interface jk
{
string kan();
}
//子类
public class cx1:cx,jk
{
public override string ren()
{
return "人";
}
public string kan()
{
return "看";
}
}
总结:面向对象的三大特征
封装:保证对象自身数据的完整性、安全性;
继承:建立类之间的关系,实现代码复用、方便系统的扩展;
多态:相同的方法调用可实现不同的实现方式。