単純なGUIフレームワークに取り組んでいますが、保護された仮想メソッドの呼び出しで問題が発生しました。
これは、IKeyboardInputListenerService
キーボードイベントを受信するために使用するサービスのインターフェイスと、Control
すべてのGUIコントロールのベースを表すクラスです。内部メソッドはリファクタリングされているメソッドです。
public interface IKeyboardInputListenerService
{
event EventHandler<KeyboardEventArgs> KeyPressed;
}
public abstract class Control
{
public IKeyboardInputListenerService KeyboardInputListenerService { get; }
protected Control(IKeyboardInputListenerService keyboardInputListenerService) =>
KeyboardInputListenerService = keyboardInputListenerService;
public event EventHandler<KeyboardEventArgs> KeyPressed;
/* protected */ internal virtual void OnKeyPressed(object sender, KeyboardEventArgs args)
{
if (enabled && visible && focused && !args.Suppressed)
{
KeyPressed?.Invoke(sender, args);
args.Suppressed = true;
}
}
public void Activate() =>
KeyboardInputListenerService.KeyPressed += new EventHandler<KeyboardEventArgs>(OnKeyPressed);
}
またContainerControl
、子コントロール(Panel
またはGroupBox
Windowsフォーム内)を含むことになっているクラスを作成し、仮想メソッドをオーバーライドします。
public abstract class ContainerControl : Control
{
private readonly ObservableCollection<Control> controls;
protected ContainerControl(IKeyboardInputListenerService keyboardInputListenerService)
: base(keyboardInputListenerService) =>
controls = new ObservableCollection<Control>();
/* protected */ internal override void OnKeyPressed(object sender, KeyboardEventArgs args)
{
foreach (Control control in controls)
control.OnKeyPressed(sender, args);
base.OnKeyPressed(sender, args);
}
}
問題は、などのメソッドに使用する修飾子を決定できないことOnKeyPressed
です。それらを作成したかったのですprotected
が、コンパイラエラーが発生します。
エラーCS1540タイプ「Control」の修飾子を介して保護されたメンバー「Control.OnKeyPressed(object、KeyboardEventArgs)」にアクセスできません。修飾子はタイプ 'ContainerControl'(またはそれから派生)である必要があります
それらを作成することはできますがpublic
、階層間の呼び出しによって引き起こされた問題を解決する以外に理由がないため、実際には良い考えではないと思います。私はそれらを作成しましinternal
たが、欠点もあります。誰かがユーザーコントロールを作成したい場合、イベントを受信できないため、コントロールは役に立たなくなります。
問題は、メソッドをパブリックアクセスにすることなく、派生クラスから基本クラスの仮想メソッドにアクセスする方法です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加