2016-08-18 5 views
0

BaseTypeオブジェクトがたくさんあるとし、DerivedType B、CまたはDのすべてに対してアクションAを実行する必要があるとします。また、必要なメソッドがないため、BaseTypeのインスタンスにはできません。私の場合は、ASP.NET Webフォームページ上の特定のタイプのすべてのコントロールにクラスを割り当てる必要があり、コードは次のようになります。一部の派生型にしか存在しないメソッドを呼び出す

if (myControl != null) 
    { 
     foreach (var input in myControl.Controls.OfType<TextBox>()) 
     { 
      input.CssClass = "my-class"; 
     } 
     foreach (var input in myControl.Controls.OfType<DropDownList>()) 
     { 
      input.CssClass = "my-class"; 
     } 
     foreach (var input in myControl.Controls.OfType<RadioButtonList>()) 
     { 
      input.CssClass = "my-class"; 
     } 
     foreach (var input in myControl.Controls.OfType<CheckBox>()) 
     { 
      input.CssClass = "my-class"; 
     } 
    } 

代替はすべてmyControl.Controlsし、チェックをループにありますDerivedType Xとしてのコントロールが各コントロールとそれぞれのDerivedTypeについてnullでない場合、私はそれらのそれぞれに全く同じことをするために興味があります。

ここに明白な何かが欠けているのだろうか(多型がどのように機能するか完全に理解できない場合)。 This questionは、カスタムクラスのためにそれを行う方法に関する一般的なアイデアを提供しますが、残念ながら私はコントロールがついていません。

上記の作業を行う上手な方法はありますか?

ありがとうございます!

+0

_polymorphism_ではなく_abstractions_を意味すると思います。なぜならクライアントコードは一般的にその型が気にかからないからです。あなたのコードはオブジェクト型をテストしているので、抽象化をうまく利用していません。 Webコントロールは_polymorphism_ – MickyD

答えて

-1

これは、他のコードを変更しなくても簡単に行うことができる最も簡単な方法です。そうすれば、あなたが探している派生型の1つであるかどうかをループして調べることができます。

for(int i = 0; i < myControl.Controls.Length; i++) 
{ 
    if(myControl.Controls[i] is TextBox || myControl.Controls[i] is DropDownList || 
     myControl.Controls[i] is RadioButtonList || myControl.Controls[i] is Checkbox) 
    { 
     var webControl = myControl.Controls[i] as WebControl; 
     webControl.CssClass = "my-class"; 
    }   
} 
+1

の例である類似の_interfaces_(例えば 'CssClass'プロパティ)を共有します。' Control'は '.CssClass'プロパティを持っていません。質問を読む。 https://msdn.microsoft.com/en-us/library/system.web.ui.control(v=vs.110).aspx – Aron

1

実際にはかなり簡単です。

実行したいコードがある...

foreach(var child in control.Controls) 
{ 
    var webChild = child as WebControl; 
    if(webChild == null) return; 
    webChild.CssClass = "Foo"; 
} 

しかしLINQのは、すでに「試すキャスト、フィルタ」方式は、.OfType<>()を呼びかけています。

あなたは、私が多型で動作するようにしようとしたときにクラス階層を調べることをお勧めします。この

foreach(var child in control.Controls.OfType<WebControl>()) 
{ 
    child.CssClass = "Foo"; 
} 

のようにそれを使用することができます。 Object BrowserまたはMSDNの参照を使用する必要があります。

あなたが見ていたすべてのクラスがWebControlを継承していることを伝えておき、このクラスでは.CssClassを設定できます。

+0

これは、「WebControl」から派生した_all_コントロールに「Foo」を割り当てます。 OPのように "特定のタイプのコントロール" _とにかく抽象と多形性をうまく利用していない可能性があります。 – MickyD

+0

@MickyD Nope。すべての 'WebControl'に。 'Controls'コレクションには' Control'sが含まれています。おそらく私はOPがここで値を設定したくないコントロールの例を示していないので、ここで間違った終わりを取ってしまったでしょう...しかしそれはTDDのもう一つのテストケースです。 :D – Aron

+0

foreachループ内でエントリを変更することはできません。 –

関連する問題