如果返回类型不同..那么它将超载或过度骑行

时间:2012-02-23 09:22:11

标签: c# oop

public int Add(int a, int b) 
public float Add(int a, int b) 

返回的类型不同。

这是重载还是覆盖?

如果访问类型不同则该怎么办

public int Add(int a, int b) 
private int Add(int a, int b)
你能帮帮我吗?

4 个答案:

答案 0 :(得分:6)

它既不是:它是无效的代码。你不能创建两个只有返回类型不同的方法。 (或者通过返回类型和访问修饰符...)

如果可以的话,它会超载 - 覆盖继承层次结构中的覆盖,其中派生类中的方法会覆盖在基类中声明的虚方法。在这种情况下,你没有表明他们在不同的班级。

重载和覆盖之间的最大区别在于决定使用哪种方法:编译器根据编译时类型选择签名,然后根据实际对象的执行时间类型。

因此,如果方法Derived.M(int)覆盖Base.M(int),那么编译器并不关心 - 它只知道它正在调用Base.M(int)并让CLR负责虚拟调度。

但是,如果有方法Foo.M(int)Foo.M(float),则编译器会在编译时决定 将使用哪些方法。 (当然,它们也可以是虚拟的,也包括覆盖。)

值得注意的是,跨越继承层次结构的重载也很有趣 - 我有一个完整的article about overloading列出了您可能遇到的一些奇怪的事情。

答案 1 :(得分:3)

<强>既不即可。这是一个编译时错误:

error CS0111: Type 'Foo' already defines a member called 
'Add' with the same parameter types

返回类型和访问类型都不是方法签名的一部分。

答案 2 :(得分:1)

它既不是!

你不能这样做,因为参数需要不同。只是不同的返回类型不起作用。

答案 3 :(得分:1)

在C#中它是非法的,但根据this question,返回不同类型的两个类似函数称为其他语言的重载(例如Perl)。

至于拥有不同的访问修饰符,我不知道是否有任何语言支持。 C#肯定没有。