[原创]到底调用哪个方法
这么个程序:
using System;
namespace ConsoleApplication1
{
//基类,就一个虚函数
class clsA
{
public virtual void app(int a)
{ }
}
//继承类
class clsB : clsA
{
public override void app(int a)
{
Console.WriteLine("调用int的!");
}
public void app(double a)
{
Console.WriteLine("调用double的!");
}
}
class Program
{
static void Main(string[] args)
{
clsB b = new clsB();
b.app(5);
}
}
}
在主函数里 b.app(5),是调用参数int类型的,还是double类型的?!在这里,运行的是参数为double的!
有的人说,把double类型的方法和int类型的方法改下,但是,改下也是运行public void app(//)。
我找了下资料:
其实,在这里有个概念就是:利用 override 和 new 关键词重写基类的方法的,在派生类看来,不是属于它
本身的,只是对基类方法的新的实现。在本例子中,public void app(double a){} 才是派生类自己定义的方法,
只有当调用的方法于派生类自己定义的方法不兼容的化,才区调用重写的方法!在这里,int可以隐式的转换成double
类型的,所以可以被调用!如果,把public void app(double a){}改为:public void app(int a){},而在主函数
里调用的是b.app(5.55);,那么,程序检查了派生类自定义的方法不匹配,才区调用重写的方法!
解决的办法:
可以强制转换对象为基类对象,((clsA)b).app(5);但是,根本解决办法最好是别定义和基类的虚方法
相同的方法名!
using System;
namespace ConsoleApplication1
{
//基类,就一个虚函数
class clsA
{
public virtual void app(int a)
{ }
}
//继承类
class clsB : clsA
{
public override void app(int a)
{
Console.WriteLine("调用int的!");
}
public void app(double a)
{
Console.WriteLine("调用double的!");
}
}
class Program
{
static void Main(string[] args)
{
clsB b = new clsB();
b.app(5);
}
}
}
在主函数里 b.app(5),是调用参数int类型的,还是double类型的?!在这里,运行的是参数为double的!
有的人说,把double类型的方法和int类型的方法改下,但是,改下也是运行public void app(//)。
我找了下资料:
其实,在这里有个概念就是:利用 override 和 new 关键词重写基类的方法的,在派生类看来,不是属于它
本身的,只是对基类方法的新的实现。在本例子中,public void app(double a){} 才是派生类自己定义的方法,
只有当调用的方法于派生类自己定义的方法不兼容的化,才区调用重写的方法!在这里,int可以隐式的转换成double
类型的,所以可以被调用!如果,把public void app(double a){}改为:public void app(int a){},而在主函数
里调用的是b.app(5.55);,那么,程序检查了派生类自定义的方法不匹配,才区调用重写的方法!
解决的办法:
可以强制转换对象为基类对象,((clsA)b).app(5);但是,根本解决办法最好是别定义和基类的虚方法
相同的方法名!