c# 多态
实现多态的方法:1.虚方法vartual 2.抽象类、抽象方法 abstract 3.接口 interface。
1、虚方法
//第一步把父类方法加上virtual,可被子类重写 重写后 this.表示重写以后的方法、base.父类中继承下来的方法
public class Person
{
public virtual void Saynation()
{
Console.WriteLine("人");
}
}
public class American : Person
{
//通过用override 重写父类虚方法
public override void Saynation()
{
Console.WriteLine("USA");
}
}
public class Chinese : Person
{
public override void Saynation()
{
Console.WriteLine("CHINA");
}
}
public class Japanese : Person
{
public override void Saynation()
{
Console.WriteLine("JAPAN");
}
}
2、抽象类
//1.可以有实例成员、也可以抽象成员
//2.抽象成员不能有任何实现
// 3.抽象成员必须在抽象类
//4.不能实例化对象,那么抽象类的作用就是用来被继承 主要目的是用来实现多态
//5. 继承以后 必须用overvide 重写 、除非子类也是abstract
abstract class myclas
{
public int Age
{
get;
set;
}
public abstract void SayHi();
}
class myclass1 : myclas
{
public override void SayHi()
{
Console.WriteLine("hao");
}
}
3、接口
//接口是一系列相关的功能的抽象、强制必须实现。
//接口 与抽象类 重用和扩展用继承
//更加关心他有相同的功能--- 接口
//还是关心他的扩展性、重复使用----抽象类
public interface Irunable
{
void run();
}
public interface ISwimable
{
void swim();
}
public interface IRunSwimable : Irunable, ISwimable
{
void change();
}
public class 动物
{
}
public class 陆地动物:动物,Irunable
{
public void run()
{
}
}
public class 豹子:IRunSwimable
{
public void change()
{
throw new NotImplementedException();
}
public void run()
{
throw new NotImplementedException();
}
public void swim()
{
throw new NotImplementedException();
}
}
多态与重载的区别:
重载:
在基类中定义了一个非虚拟函数,然后在派生类中定义一个同名,但是具有不同的参数表的函数,这就是重载。在派生类对象上调用这几个函数时,用不同的参数会调用到不同的函数,有可能会直接调用到基类中的那个。
多态:
在基类中定义了一个虚拟函数,然后在派生类中又定义一个同名,同参数表的函数,这就是多态。多态是这3种情况中唯一采用动态绑定技术的一种情况。也就是说,通过一个基类指针来操作对象,如果对象是基类对象,就会调用基类中的那个函数,如果对象实际是派生类对象,就会调用派声雷中的那个函数,调用哪个函数并不由函数的参数表决定,而是由函数的实际类型决定。