独習C#第3版p483を読んでいて、ジェネリックの基本クラス制約とクラス継承によるメソッドの隠ぺい関係について知りたくなり、以下の通り実験した。
結果、基本クラス制約が強く、メソッド隠ぺいを無効にすることが分かった。
usingSystem;namespacep483{classProgram{classReverseClass{publicstringReverseStr(stringstr){// 文字列を反転するメソッドstringresult="";foreach(charchinstr)result=ch+result;returnresult;}}// ReverseClassクラスから継承するNonReverseClassクラスclassNonReverseClass:ReverseClass{// ここでは、ジェネリックの基本クラス制約の機能を確認するために、// ReverseMethodsクラスのReverseStrメソッドを隠ぺいするnewpublicstringReverseStr(stringstr){returnstr;// メソッド名はReverseであるが基本クラス制約の機能を// 確認するためこのクラスでは反転させず、パラメータをそのまま戻す}}// ReverseClassで基本クラス制約をかけるclassTest<T>whereT:ReverseClass{Tobj;publicTest(To){obj=o;}publicvoidShowReverse(stringstr){StringrevStr=obj.ReverseStr(str);Console.WriteLine(revStr);Console.WriteLine();}}staticvoidMain(){ReverseClassobjA=newReverseClass();NonReverseClassobjB=newNonReverseClass();Console.WriteLine("基本クラスによるジェネリック");Test<ReverseClass>t1=newTest<ReverseClass>(objA);t1.ShowReverse("This is a test.");Console.WriteLine("継承クラスによる隠ぺいをした場合のジェネリック");Test<NonReverseClass>t2=newTest<NonReverseClass>(objB);t2.ShowReverse("More testing.");t2.ShowReverse("基本クラス制約をかけると、継承クラスの隠ぺいは無効になることがわかる。");Console.WriteLine("継承クラスでメソッドを隠ぺいして、文字列を反転しないようにしたが、");Console.WriteLine("その効果は表れず、継承クラスの隠ぺいは呼び出されなかった。");Console.WriteLine();}}}