多态
class Animal
{
private int age;
public int Age
{
set{ age = value;}
get{ return age;}
}
public virtual void Voice()
{
Console.WriteLine ("Animal");
}
}
{
private int age;
public int Age
{
set{ age = value;}
get{ return age;}
}
public virtual void Voice()
{
Console.WriteLine ("Animal");
}
}
class House:Animal
{
public override void Voice()
{
Console.WriteLine ("House");
}
}
class Sheep:Animal
{
public override void Voice()
{
Console.WriteLine ("Shpeep");
}
}
{
public override void Voice()
{
Console.WriteLine ("House");
}
}
class Sheep:Animal
{
public override void Voice()
{
Console.WriteLine ("Shpeep");
}
}
//多态(一个方法多种状态)
Animal a = new House ();
Animal b = new Sheep ();
Method (a);
Method (b);
//如果没虚函数,则10个动物需要写10个方法,每次不同对象调用method,
//就需要写该对象的方法,如果有虚函数,则形参只需要为父对象,
//通过父类指向类实现调用不同子类的方法,替代了原来的10种子类的方法,从而实现多态
Animal a = new House ();
Animal b = new Sheep ();
Method (a);
Method (b);
//如果没虚函数,则10个动物需要写10个方法,每次不同对象调用method,
//就需要写该对象的方法,如果有虚函数,则形参只需要为父对象,
//通过父类指向类实现调用不同子类的方法,替代了原来的10种子类的方法,从而实现多态
只有虚方法才能被重写
abstract class Class
{
//抽象类相当于c++纯虚函数
public abstract void print();
}
class ClassA:Class
{
//可以重写抽象类(abstract)和虚函数(virture)override
public override void print()
{
Console.WriteLine ("Class A");
}
}
class ClassB:ClassA
{
public override void print()
{
Console.WriteLine ("Class B");
}
}
{
//抽象类相当于c++纯虚函数
public abstract void print();
}
class ClassA:Class
{
//可以重写抽象类(abstract)和虚函数(virture)override
public override void print()
{
Console.WriteLine ("Class A");
}
}
class ClassB:ClassA
{
public override void print()
{
Console.WriteLine ("Class B");
}
}
子类继承与父类的虚方法,虽然该子类重写虚方法,但它还是虚方法,下代们的子类可以重写虚方法
隐藏
子类可以隐藏父类的方法,不过在c#中会发出警告,添加一个new就ok了
使用new修饰,可以隐藏同名函数。
class ClassA//没有指定继承,则默认继承object
{
public int x;
public int y;
public ClassA(int _x,int _y)
{
x = _x;
y = _y;
}
public void Method()
{
Console.WriteLine ("classA Method");
}
}
class ClassB:ClassA
{
public int z;
public ClassB(int _x,int _y,int _z):base(_x,_y)//只能用base(父类)
{
z=_z;
}
public new void Method()
{
Console.WriteLine ("classB Method");
}
}
{
public int x;
public int y;
public ClassA(int _x,int _y)
{
x = _x;
y = _y;
}
public void Method()
{
Console.WriteLine ("classA Method");
}
}
class ClassB:ClassA
{
public int z;
public ClassB(int _x,int _y,int _z):base(_x,_y)//只能用base(父类)
{
z=_z;
}
public new void Method()
{
Console.WriteLine ("classB Method");
}
}