3

.NET Framework から提供されるものよりも多くのプロパティとメソッドを実装する独自のユーザー コントロールを作成したいと考えています。まず第一に、私が呼び出し、もちろん継承するカスタムUserControlクラスを持ちたいと思います:MyUserControlUserControl

public class MyUserControl : UserControl {
   public MyUserControl() : base() {
   }
   ...
}

MyTestBoxその後、から継承する独自の を持ちたいと思いTextBoxます。

public class MyTextBox : TextBox {
   public MyTextBox() : base() {
   }
   ...
}

私の問題は、そこにも必要なプロパティとメソッドが実装されているため、MyTextBox継承したいということです。MyUserControlMyTextBox

私が考えることができる唯一の解決策は、MyTextBox が TextBox からではなく MyUserControl からのみ継承されるようにすることですが、コンストラクターでそれに TextBox を追加します。

public class MyTextBox : MyUserControl {
   public MyTextBox() : base() {
      Add(new TextBox());
   }
   ...
}

TextBoxしかし、その後、 inのすべてのプロパティとメソッドを再実装する必要がありMyTextBoxます。これを達成するためのより良い方法はありますか?

4

2 に答える 2

0

問題をより詳細に調べた後、最終的に次の結論に達しました。目的を達成するには 3 つの方法がありますが、いずれも追加の実装が必要です。

まず第一に、多重継承は C# .NET ではサポートされていません。私の場合、 とのMyTextBox両方からカスタム プロパティ/メソッドにアクセスできるようにしたかったので、とにかく物事がより複雑になります。しかし、これらのクラスは両方とも Component Class から継承するため、多重継承 (可能であれば) はここで混乱を招きます。私が自問自答したのは、「あなたは最終的に何をしたいですか?」ということです。答えは、すべての my (または) を一般的に (つまり、すべてに関して) だけでなく、具体的に (つまり、、 、 など) も"拡張" できるようにしたいということです。そのため、MyTextBox オブジェクトを作成するときに、両方を行います:MyUserControlTextBoxUserControlsComponentsUserControlsTextBoxComboboxListView

myTextBox.MyUserControlStuff();

myTextBox.TextBoxStuff();

だからここに私の解決策があります:

1.拡張機能を使用する

UserControl (または Component) クラスを拡張します。その場合、私は:

public class MyTextBox : TextBox
{
    public void MyTextBoxStuff()
    {
        ...
    }
}

public static class UserControlExtensions
{
    public static void MyUserControlStuff(this UserControl control)
    {
        ...
    }
}

また、MyTextBox は、すべての UserControl と TextBox の機能も実行できます。

欠点:すべての(特定の)拡張メソッドが UserControl にも適用されます。

2. インターフェイスを使用する

public class MyTextBox : TextBox, IUserControlStuff
{
    public void MyTextBoxStuff()
    {
        ...
    }
    public void MyUserControlStuff()
    {
        ...
    }
}

public interface IUserControlStuff
{
    public void MyUserControlStuff();
}

欠点: MyUserControlStuff を何度も何度も再実装する必要があります。

3.「追加コード」クラスを使用して、それを各カスタム UserControl および MyUserControl のメンバーにします (@Mr.Karlsen が提案したように)

詳細については、@ Mr.Karlsen の回答を参照してください。これが最善の解決策だと思いますが、欠点もあります

欠点:少し面倒。私のプロジェクトに不慣れな開発者は、初めて見たときに理解するのが難しいと感じるでしょう。私は個人的にそれを避けます。

私の UserControl プロパティ/メソッドは私のニーズに固有のものであるため、「特定の」もので UserControl を拡張するのは良くないため、最終的にインターフェイスを使用することにしました。私の場合、より多くのコードを書かなければならず、インターフェースのメソッドを実装する際に同じコードを書き直さなければなりませんが、これは本当に嫌いです。ともかく!!

于 2013-10-11T09:53:11.100 に答える