2012-02-23 9 views
0
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) 

あなたは私を何助けることができますか?

+0

戻り値を取得せずにメソッドを呼び出すと、どのようなものが呼び出されますか? –

+0

誰があなたにこれを入力して試してみるのをやめているのですか? – V4Vendetta

答えて

6

どちらでもない:無効なコードです。 は、戻り値の型だけが異なる2つのメソッドを作成できません。 (または、戻り値の型とアクセス修飾子によって...)

あなたは、それがが過負荷にされるだろうことができれば - オーバーライドは、派生クラスのメソッドをベースに宣言した仮想メソッドをオーバーライドする全体で継承階層を、たまたまクラス。この場合、あなたは彼らが別のクラスに入っていることを知らせませんでした。コンパイラは、コンパイル時タイプに基づいて署名を選び、その後実装はexecution-に基づいて選択され:

オーバーロードとオーバーライドの最大の違いは、決定は、使用する方法について行われたときであります時間実際のオブジェクトのタイプ。

Base.M(int)をオーバーライドするDerived.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 

戻り型もアクセス型もメソッドシグネチャの一部ではありません。

+0

「戻り値の型はメソッドシグネチャの一部ではない」とはいいとは思いません。 – ken2k

+0

@ ken2k確かに[そのように言う](http://msdn.microsoft.com/en-us/library/aa691131%28v=vs.71%29.aspx) – V4Vendetta

1

C#では不正ですが、this questionによれば、異なる型を返す2つの同様の関数は、他の言語(Perlなど)ではオーバーロードと呼ばれます。

異なるアクセス修飾子を使用しているため、言語でサポートされているかどうかはわかりません。 C#はもちろんありません。

関連する問題