System.Windows.FormsのPanelとLabelを継承したカスタムコントロール(PanelEx、LabelEx)を作成していますが、それぞれに共通した処理があるため、切り出して別クラス(classLib)に実装したいと考えています。
この共通した処理の中にはPanelとLabelの継承元であるControlのprotectedメソッドを呼び出す処理もあるためclassLibの継承元を指定して宣言したいのです。
つまり以下のようなことがしたいです。
class classLib<T> : T
class PanelEx : classLib<Panel>
class LabelEx : classLib<Label>
しかし、ジェネリックの型パラメータは派生させることができず困っています。
こういうことはそもそもできないのでしょうか?それとも別の方法で実現できる手段が提供されているのでしょうか?
これでどうでしょうか
型パラメータの制約が必要ならば追加してください
public class TestGen<T> : Control { public void TestControl() { base.CreateHandle(); } } public class PanelEx : TestGen<Panel> { } public class LabelEx : TestGen<Label> { }
ご指摘の通りControlの継承になっているので
LabelやPanel固有のメソッド等は使用できません。
もしTの継承ができたとしても、TはPanelやLableに変化するので
ジェネリッククラスのなかでT.XXXという方法でPanelやLableの固有のメソッドを
呼び出すことはできません
Protectedのメソッドを公開することは余りいい方法だと思いませんが
このようにすると、たぶんご希望のことができると思います。
(internalにすると少しはまし)
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
namespace TestControl
{
public interface IControlEx
{
/// <summary>
/// Protectedへのアクセス
/// </summary>
void ProtectedMethodAccess();
}
public class LabelEx : Label, IControlEx
{
public void ProtectedMethodAccess()
{
// プロテクトなメソッド
base.CreateHandle();
}
}
public class PanelEx : Panel, IControlEx
{
public void ProtectedMethodAccess()
{
// プロテクトなメソッド
base.CreateHandle();
}
}
public static class Util
{
/// <summary>
/// パネル固有の処理
/// </summary>
public static void Method(PanelEx pnl)
{
Util.ControlExMethod<PanelEx>(pnl);
}
/// <summary>
/// ラベル固有の処理
/// </summary>
public static void Method(LabelEx lbl)
{
Util.ControlExMethod<LabelEx>(lbl);
}
/// <summary>
/// コントロールEx共通の処理
///
/// ControlやIControlExを継承したクラスへの処理を記述
/// </summary>
public static void ControlExMethod<T>(T ctlEx)
where T : Control, IControlEx
{
ctlEx.ProtectedMethodAccess();
}
}
}
やはりこの様な形になりますよね... コード例までご提示頂きありがとうございました。