多态
学习OOp多态
* 1.方法重载
* 2.方法重写
* 3.里氏替换原则
*
* 方法重载:构造函数就属于特殊的方法重载
* 方法重载就是指在同一类中相同方法的不同行为
*
* 方法重载的特点:
* 1.方法名必须相同
* 2.参数列表必须不相同,这里的不相同指的是参数类型,参数个数,以及参数顺序
* 3.在用相同参数列表个数的前提下,方法返回值不作为判断方法是否重载的依据
*
* 方法重写:是指在继承关系中不同类之间方法之间比较和研究
* 第一个关键字:virtual(虚)
* 用virtual修饰的方法叫虚方法
*
* virtual一般情况下和override需要
成对出现
* 如果子类重写使用了override,则父类必须拥有virtual修饰的方法
* 反过来不一定成立,因为我们还有方法覆盖
*
* 第二个关键词:override(重写)
*
* 为什么要使用方法重写?
* 1.使用虚方法其实就是对目前的程序不是恒满意,暂时方法功能是实现的,希望后面的程序员通过重写方法的方式,进行系统的优化
* 2.可以通过继承系统提供的类,去修改系统
*
* 方法重写需要注意的地方
* 1.不能重写父类中用sealed修饰的地方
* 2.不能重写父类中用static修饰的方法
* 3.如果父类中存在abstract方法,子类必须重写
*/
* 密封类:断子绝孙类
* 如果我们的类是密封类,那么就意味着不能有任何派生类
* 但是密封类可以拥有父类
*
* C#中密封类使用sealed关键字,sealed可以将类或者方法声明为密封类或者密封方法
* 对于密封类来说,表示不能继承该类
* 对于秘封方法来说,表示不能重写该方法
*
* 密封类不能使用protected
* 密封类不能使用virtual
*
* 密封类的不可继承性,所以密封类不能声明为抽象的,既sealed关键字不能和abstract共同使用
*
* 如果用sealed修饰方法,必须要遵循一个条件,这个类必须有父类,并且重写了父类的某个虚方法才可以用sealed修饰,否则是绝对不行的
*
* 密封类的作用是防止外界修改到本类,破坏类的内部结构
*
重载实例
//练习1:利用多态实现加法器,要求实现至少4种重载方式
class Person
{
public void SayChinese(int a,int b)
{
int c = a + b;
Console.WriteLine (c);
//Console.WriteLine ("中国话");
}
public void SayChinese(double a,double b)
{
double c = a + b;
Console.WriteLine (c);
}
public void SayChinese(int a,double b)
{
double c = a + b;
Console.WriteLine (c);
}
//练习二:在上面的基础上,利用最下面一种方法计算加减乘除
public void SayChinese(string flag, int n1,int n2)
{switch(flag)
{
case "+":
int c = n1 + n2;
Console.WriteLine (c);
break;
case "-":
c = n1 - n2;
Console.WriteLine (c);
break;
case "*":
c = n1 * n2;
Console.WriteLine (c);
break;
case "/":
c = n1 / n2;
Console.WriteLine (c);
break;
}
重写实例
class BaseClass
{
public virtual void SayHi()
{
Console.WriteLine ("BaseClass需方法调用");
}
}
class SubClass:BaseClass
{
public override void SayHi ()
{
base.SayHi ();
Console.WriteLine ("SubClass重写父类SayHi");
}
}
//练习1:猫科动物(毛,老虎,狮子),猫科动物具有叫的行为子类也有叫的行为,但是
//每个子类的行为却不一样,用多态解决该问题
class Felidae
{
public virtual void Cry()
{
Console.WriteLine ("Felidae 调用");
}
}
class Mao:Felidae
{
public override void Cry ()
{
Console.WriteLine ("Mao 调用");
}
}
class Laohu:Felidae
{
public override void Cry ()
{
Console.WriteLine ("Laohu 调用");
}
}
class Shizi:Felidae
{
public override void Cry ()
{
Console.WriteLine ("Shizi 调用");
}
}
Felidae f=new Felidae();
f.Cry ();
Mao m = new Mao ();
m.Cry ();
Laohu l = new Laohu ();
l.Cry ();
Shizi s = new Shizi ();
s.Cry ();
密封类
class DD
{
public virtual void As()
{
Console.WriteLine ("AA");
}
}
sealed class A:DD
{
public sealed override void As()
{
Console.WriteLine ("bb");
}
}