問題をより詳細に調べた後、最終的に次の結論に達しました。目的を達成するには 3 つの方法がありますが、いずれも追加の実装が必要です。
まず第一に、多重継承は C# .NET ではサポートされていません。私の場合、 とのMyTextBox
両方からカスタム プロパティ/メソッドにアクセスできるようにしたかったので、とにかく物事がより複雑になります。しかし、これらのクラスは両方とも Component Class から継承するため、多重継承 (可能であれば) はここで混乱を招きます。私が自問自答したのは、「あなたは最終的に何をしたいですか?」ということです。答えは、すべての my (または) を一般的に (つまり、すべてに関して) だけでなく、具体的に (つまり、、 、 など) も"拡張" できるようにしたいということです。そのため、MyTextBox オブジェクトを作成するときに、両方を行います:MyUserControl
TextBox
UserControls
Components
UserControls
TextBox
Combobox
ListView
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 を拡張するのは良くないため、最終的にインターフェイスを使用することにしました。私の場合、より多くのコードを書かなければならず、インターフェースのメソッドを実装する際に同じコードを書き直さなければなりませんが、これは本当に嫌いです。ともかく!!