关于方法重载的基本问题

Bru*_*nes 9 c#

如果我有一个SubOfParent类,它是Parent的子类,还有两个方法:

 public static void doStuff(Parent in) {}

 public static void doStuff(SubOfPArent in) {}
Run Code Online (Sandbox Code Playgroud)

为什么在传递SubOfParent类型对象时会调用第一个 doStuff?

感谢您对此有任何见解!

Mar*_*k H 12

Parent p = new SubOfParent();
SubOfParent s = new SubOfParent();

doStuff(p); //calls doStuff(Parent in)
doStuff(s); //calls doStuff(SubOfParent in)

//If you're working with a parent but need to call the subclass, you need to upcast it.
dostuff(p as SubOfParent);
Run Code Online (Sandbox Code Playgroud)

  • 在这个例子中很明显p是SubOfParent类型,但情况并非总是如此.为了避免在doStuff中出现任何意外,最好是upcast,检查null,然后拨打电话.SubOfParent subOfParent = p as SubOfParent; if(subOfParent!= null)doStuff(subOfParent); (4认同)

tst*_*ter 8

方法重载是在编译时完成的,而不是在运行时完成的,所以你不会看到它的任何多态性.无论调用代码知道什么类型,都将指定调用哪个方法.

如果你想调用第二种方法,你可以转换为类型,SubOfPArent或者你可以将这些方法放入类中,然后调用它来获取多态:

public class Parent 
{
  public virtual void doStuff() {}
}

public class SubOfPArent : Parent
{
  public override void doStuff() {}
}
Run Code Online (Sandbox Code Playgroud)

...

Parent obj = getASubOfPArent();
obj.doStuff();
Run Code Online (Sandbox Code Playgroud)

  • 问题是关于静态函数,而不是实例函数. (2认同)