何を隠しているのか
継承したクラスで親クラスと同名のメソッドを定義すると、親クラスのメソッドを隠してしまいます。
app.cs(14,19): warning CS0108: 'Bar.Add(double, double)' は継承されたメンバ 'Foo.Add(double, double)' を非表示にします。非表示にする場合は、new キーワードを使用してください。 app.cs(8,19): (以前のエラーに関連する警告の位置) app.cs(20,19): warning CS0108: 'Baz.Add(double, double)' は継承されたメンバ 'Bar.Add(double, double)' を非表示にします。非表示にする場合は、new キーワードを使用してください。 app.cs(14,19): (以前のエラーに関連する警告の位置)
このような警告が出るのですぐ気づくと思います。ところで、インタフェース継承している場合、メンバはクラスのメンバだけでなく、インタフェースのメンバでもあることを忘れがちです。警告ではあくまでもクラスのメンバを非表示にしていることしか指摘していません。
なんか、引っかけ問題みたいで嫌なんですが・・・
using System; public interface IMath { double Add (double x, double y); } public class Foo : IMath { public double Add (double x, double y) { return x + y; } } public class Bar : Foo, IMath { public double Add (double x, double y) { // 何故か引き算 return x - y; } } public class Baz : Bar { public double Add (double x, double y) { // 何故か掛け算 return x * y; } } public class App { public static void Main () { Baz baz = new Baz (); Console.WriteLine ("{0}", baz.Add (10, 20)); // Baz.Add Bar bar = baz; Console.WriteLine ("{0}", bar.Add (10, 20)); // Bar.Add Foo foo = bar; Console.WriteLine ("{0}", foo.Add (10, 20)); // Foo.Add IMath math = foo; Console.WriteLine ("{0}", math.Add (10, 20)); // Bar.Add } } /* 結果 200 -10 30 -10 */
継承して更に同一インタフェースを再実装なんて普通やらないとは思いますが。(^^;