C#-クラスプロパティ(または関数パラメーター)の「複数の継承」

トピックは、プロパティ(または関数パラメーター)のC#での多重継承の問題から生まれました。 shedalのアドバイスに関する記事を読んだ後、C#の型としていくつかのインターフェイスを指定する方法を思いつきました。



C#では、クラスに複数のインターフェイスを実装させることができます。 そして、複数のインターフェイスでプロパティを実装する場合はどうでしょうか? このために毎回新しいタイプを作成しないでください?







そのため、dotNET 4に登場したタプル(クラスタプル<>)を使用してインターフェースをグループ化します。 dotNETのバージョン3では、タプルを独立して作成できます-これは簡単です。



interface IClickableButton { event Action Click; } interface IColorButton { Color Color { get; set; } } interface IButtonWithText { string Text { get; set; } } interface IMyForm1 { Tuple<IClickableButton, IColorButton> Button { get; } } interface IMyForm2 { Tuple<IClickableButton, IButtonWithText> Button { get; } } interface IMyForm3 { Tuple<IClickableButton, IColorButton, IButtonWithText> Button { get; } } public class Button : IClickableButton, IColorButton, IButtonWithText { public event Action Click; public Color Color { get; set; } public string Text { get; set; } } class MyForm1 : IMyForm1 { private readonly Button _button = new Button(); public Tuple<IClickableButton, IColorButton> Button { get { return new Tuple<IClickableButton, IColorButton>(_button, _button); } } } class MyForm2 : IMyForm2 { private readonly Button _button = new Button(); public Tuple<IClickableButton, IButtonWithText> Button { get { return new Tuple<IClickableButton, IButtonWithText>(_button, _button); } } } class MyForm3 : IMyForm3 { private readonly Button _button = new Button(); public Tuple<IClickableButton, IColorButton, IButtonWithText> Button { get { return new Tuple<IClickableButton, IColorButton, IButtonWithText>(_button, _button, _button); } } } class UsageExample { void Example1(IMyForm1 form) { form.Button.Item1.Click += () => { }; form.Button.Item2.Color = Colors.Red; } void Example2(IMyForm2 form) { form.Button.Item1.Click += () => { }; form.Button.Item2.Text = "Hello, World!"; } void Example2(IMyForm3 form) { form.Button.Item1.Click += () => { }; form.Button.Item2.Color = Colors.Red; form.Button.Item3.Text = "Hello, World!"; } }
      
      







つまり、ボタンのプロパティを記述する3つのインターフェイスがあります。クリック可能なボタン、カラーボタン、およびボタンテキストです。 最低限必要なプロパティセットのみがメソッドExample3



Example3



Example1, Example2



およびExample3



転送されるように抽象化する必要があります。 同時に、厳密なタイピングを維持する必要があります。



Tuple <>クラスを使用して、必要なインターフェースをグループ化します-完了です! Item1, Item2, Item3



などを通じてプロパティにアクセスできるようになりました。タプルを使用して、少なくとも1ダースのインターフェイスを組み合わせることができます。



誰かがきれいなソリューションを持っている場合-やってみましょう!



All Articles