首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >重述方法重载和多态性

重述方法重载和多态性
EN

Stack Overflow用户
提问于 2011-07-30 06:07:40
回答 3查看 96关注 0票数 0

这样的事情在C#中应该是可能的,对吧?

代码语言:javascript
运行
复制
    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 {}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-30 06:11:35

不是的。您的foo方法需要Class1Class2。您正在传递一个可以是Class1Class2IInterface。它不会编译,因为编译器不知道调用哪个重载方法。您必须将其强制转换为其中一种类型才能对其进行编译。

或者,IInterface将保存foo方法,该方法不接受任何参数并返回它是哪个类。然后,可以获取IInterface对象并调用obj.foo()

像这样:

代码语言:javascript
运行
复制
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();
}
票数 2
EN

Stack Overflow用户

发布于 2011-07-30 06:13:51

代码语言:javascript
运行
复制
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";
}
票数 1
EN

Stack Overflow用户

发布于 2011-07-30 06:16:57

不,非虚调用的去向是在编译时确定的,因此您不能在运行时根据类型调用不同的方法。

您可能正在寻找的是虚拟方法:

代码语言:javascript
运行
复制
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";
  }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6879520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档