这样的事情在C#中应该是可能的,对吧?
public void Start ()
{
Class1 x = new Class1 ();
string s = Something (x);
Console.ReadKey ();
}
public string Something (IInterface obj)
{
return foo (obj); // <-- Problem line
}
public string foo (Class1 bar)
{
return "Class1";
}
public string foo (Class2 bar)
{
return "Class2";
}
interface IInterface {}
class Class1 : IInterface {}
class Class2 : IInterface {}发布于 2011-07-30 06:11:35
不是的。您的foo方法需要Class1或Class2。您正在传递一个可以是Class1或Class2的IInterface。它不会编译,因为编译器不知道调用哪个重载方法。您必须将其强制转换为其中一种类型才能对其进行编译。
或者,IInterface将保存foo方法,该方法不接受任何参数并返回它是哪个类。然后,可以获取IInterface对象并调用obj.foo()
像这样:
interface IInterface
{
public string foo();
}
class Class1 : IInterface
{
public string foo()
{
return "Class1";
}
}
class Class2 : IInterface
{
public string foo()
{
return "Class2";
}
}
public void Something(IInterface obj)
{
return obj.foo();
}发布于 2011-07-30 06:13:51
public string Something (IInterface obj)
{
return foo ((Class1)obj);
OR // There's no way compiler to know with method to call.
return foo ((Class2)obj);
}
public string foo (Class1 bar)
{
return "Class1";
}
public string foo (Class2 bar)
{
return "Class2";
}发布于 2011-07-30 06:16:57
不,非虚调用的去向是在编译时确定的,因此您不能在运行时根据类型调用不同的方法。
您可能正在寻找的是虚拟方法:
public void Start () {
Class1 x = new Class1();
string s = Something(x);
Console.ReadKey();
}
public string Something (BaseClass obj) {
return obj.foo();
}
abstract class BaseClass {
abstract string Foo();
}
class Class1 : BaseClass {
public override string foo () {
return "Class1";
}
}
class Class2 : BaseClass {
public override string foo () {
return "Class2";
}
}https://stackoverflow.com/questions/6879520
复制相似问题