-->C#面向过程三大特点就是封装、继承、多态。多态看似非常变态,实际上学习了多态之后才发现恍然大悟啊。
-->里氏转换指的是子类可以无条件赋值给子类,如果父类指向的是子类,父类可以强制转换成子类。
-->多态就是一种表现形式,多种执行结果。
---先看一个例子:
class Person
{
public void Show()
{Console.WriteLine("一个人类");}
}
class Man:Person
{
public void Show()
{Console.WriteLine("男性");}
}
//普通访问。
Person p=new Person();
p.Show();//显示“一个人类”。
Man m=new Man();
m.Show();//显示“男性”。
//里氏转换。
Man m1=new Man();
Person p1=m1;
p1.Show();//显示“一个人类”。父类方法只是隐藏,并没有消失。
Man m2=(Man)p1;
m2.Show();//显示“男性”
//使用关键字new叫做显示隐藏父类方法的,说明父类也有此方法。如果不使用关键字new叫做隐式隐藏父类方法。
//如果子类中想要把继承自父类的方法重写,让父类的方法消失,就需要在父类的方法前加virtual,在子类的方法前加override。
class Person
{
public virtual void Show()
{Console.WriteLine("一个人类");}
}
class Man:Person
{
public override void Show()
{Console.WriteLine("男性");}
}
//普通访问。
Person p=new Person();
p.Show();//显示“一个人类”。
Man m=new Man();
m.Show();//显示“男性”。
//里氏转换。
Man m1=new Man();
Person p1=m1;
p1.Show();//显示“男性”。父类的方法被子类的方法重写了,
Man m2=(Man)p1;
m2.Show();//显示“男性”
--->记住口诀:new则隐藏,隐藏看类型;override则(virtual)重写,重写只看新。隐藏父类的方法时,父类的方法前是否在virtual无所谓,但重写父类的方法,父类的方法前必须加virtual,子类的方法前必须加override。
-->当父类的方法被子类的方法重写时,那么父类的方法就不需要实现了,就可以用抽象方法。
-->抽象方法就是没有方法体的方法,通俗点说就是没有大括号那段代码,小括号后面加分号结束,但是抽象方法必须在抽象类中。
abstract class Person
{
public abstract void Show();
}
-->上面就是一个抽象类中,含有一个抽象方法。
-->注意:抽象类与抽象方法有abstract修饰,与public和internal修饰不冲突。
------------抽象方法没有方法体,以();结束,没有{ }代码段。
------------抽象方法以及抽象成员只能存在于抽象类中。
------------抽象类中可以有非抽象成员。
------------抽象方法的子类必须是实现方法体,或者子类的子类实现方法体,只要最终实现方法体即可。
//通过抽象方法实现多态。
abstract class Person
{
public abstract void Show()
}
class Man:Person
{
public override void Show()
{Console.WriteLine("男性");}
}
-->里氏转换指的是子类可以无条件赋值给子类,如果父类指向的是子类,父类可以强制转换成子类。
-->多态就是一种表现形式,多种执行结果。
---先看一个例子:
class Person
{
public void Show()
{Console.WriteLine("一个人类");}
}
class Man:Person
{
public void Show()
{Console.WriteLine("男性");}
}
//普通访问。
Person p=new Person();
p.Show();//显示“一个人类”。
Man m=new Man();
m.Show();//显示“男性”。
//里氏转换。
Man m1=new Man();
Person p1=m1;
p1.Show();//显示“一个人类”。父类方法只是隐藏,并没有消失。
Man m2=(Man)p1;
m2.Show();//显示“男性”
//使用关键字new叫做显示隐藏父类方法的,说明父类也有此方法。如果不使用关键字new叫做隐式隐藏父类方法。
//如果子类中想要把继承自父类的方法重写,让父类的方法消失,就需要在父类的方法前加virtual,在子类的方法前加override。
class Person
{
public virtual void Show()
{Console.WriteLine("一个人类");}
}
class Man:Person
{
public override void Show()
{Console.WriteLine("男性");}
}
//普通访问。
Person p=new Person();
p.Show();//显示“一个人类”。
Man m=new Man();
m.Show();//显示“男性”。
//里氏转换。
Man m1=new Man();
Person p1=m1;
p1.Show();//显示“男性”。父类的方法被子类的方法重写了,
Man m2=(Man)p1;
m2.Show();//显示“男性”
--->记住口诀:new则隐藏,隐藏看类型;override则(virtual)重写,重写只看新。隐藏父类的方法时,父类的方法前是否在virtual无所谓,但重写父类的方法,父类的方法前必须加virtual,子类的方法前必须加override。
-->当父类的方法被子类的方法重写时,那么父类的方法就不需要实现了,就可以用抽象方法。
-->抽象方法就是没有方法体的方法,通俗点说就是没有大括号那段代码,小括号后面加分号结束,但是抽象方法必须在抽象类中。
abstract class Person
{
public abstract void Show();
}
-->上面就是一个抽象类中,含有一个抽象方法。
-->注意:抽象类与抽象方法有abstract修饰,与public和internal修饰不冲突。
------------抽象方法没有方法体,以();结束,没有{ }代码段。
------------抽象方法以及抽象成员只能存在于抽象类中。
------------抽象类中可以有非抽象成员。
------------抽象方法的子类必须是实现方法体,或者子类的子类实现方法体,只要最终实现方法体即可。
//通过抽象方法实现多态。
abstract class Person
{
public abstract void Show()
}
class Man:Person
{
public override void Show()
{Console.WriteLine("男性");}
}
-->多态是使用一种调用形式,实现不同的方法,从而达到不通过的功能。
备注:写于2013年6月9日