C#で階層間呼び出しを実行する方法

aa_talanin

単純な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またはGroupBoxWindowsフォーム内)を含むことになっているクラスを作成し、仮想メソッドをオーバーライドします。

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たが、欠点もあります。誰かがユーザーコントロールを作成したい場合、イベントを受信できないため、コントロールは役に立たなくなります。

問題は、メソッドをパブリックアクセスにすることなく、派生クラスから基本クラスの仮想メソッドにアクセスする方法です。

OlivierJacot-Descombes

使用する protected internal

protected internal virtual void OnKeyPressed(object sender, KeyboardEventArgs args)
{ ... }

ドキュメントには次のように書かれています。

保護された内部型またはメンバーには、宣言されているアセンブリ内の任意のコードから、または別のアセンブリの派生クラス内からアクセスできます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

間違った階層を示すEclipse呼び出し階層

分類Dev

Pythonで関数呼び出しの実行時間を制限する方法

分類Dev

Angular 2:間隔でHTTP呼び出しを実行する

分類Dev

C#の関数内でコードブロック呼び出しの実行時間をキャプチャする方法

分類Dev

関数呼び出し階層を取得するpycparser

分類Dev

DjangoでJSONREST呼び出しを実行する方法

分類Dev

djangoで30分のAPI呼び出しを実行する方法

分類Dev

asyncio python で関数呼び出しを実行する方法

分類Dev

C#でメソッドを呼び出すときに属性を実行する方法

分類Dev

C#でYouTube APIを呼び出して、すべてのYouTube動画の再生時間を取得する方法

分類Dev

1回の呼び出しで複数のajax呼び出し関数を実行する方法

分類Dev

C#でタイムアウトを追加してURL呼び出しを再試行する方法

分類Dev

C#でcURL呼び出しを行う方法

分類Dev

時間間隔で1回Ajax呼び出しを実行します

分類Dev

アンカータグでajax呼び出しを実行する方法

分類Dev

実行時にデリゲートを宣言し、C#で実行時にそのメソッドを呼び出す方法は?

分類Dev

async / awaitとtry / catchを使用して階層型API呼び出しを行う

分類Dev

C ++とC#コードの間で呼び出しを行う

分類Dev

一定時間待機し、最後の関数呼び出しのみを実行する方法

分類Dev

lpEnvironmentを渡してC#でCreateProcess()を呼び出す方法

分類Dev

PhantomJSDriverでAJAX呼び出しを実行するには?

分類Dev

IISへの長時間実行されている呼び出しを追跡する方法は?

分類Dev

C#で複数の非同期呼び出しを効率的に並行して実行するにはどうすればよいですか?

分類Dev

C#のhttps呼び出しでヘッダー値を取得する方法

分類Dev

Javaで特定の時間に実行するためにスレッドを呼び出す方法は?

分類Dev

refを使用した関数呼び出しでのC#の実行順序は何ですか?

分類Dev

クラス階層をトラバースするメンバー関数を呼び出す方法

分類Dev

GrailsでQuartzジョブの開始時に関数を1回実行し、呼び出し間で変数値を保持する方法は?

分類Dev

言語依存データを使用してPostgreSQLで階層クエリを実行する方法

Related 関連記事

  1. 1

    間違った階層を示すEclipse呼び出し階層

  2. 2

    Pythonで関数呼び出しの実行時間を制限する方法

  3. 3

    Angular 2:間隔でHTTP呼び出しを実行する

  4. 4

    C#の関数内でコードブロック呼び出しの実行時間をキャプチャする方法

  5. 5

    関数呼び出し階層を取得するpycparser

  6. 6

    DjangoでJSONREST呼び出しを実行する方法

  7. 7

    djangoで30分のAPI呼び出しを実行する方法

  8. 8

    asyncio python で関数呼び出しを実行する方法

  9. 9

    C#でメソッドを呼び出すときに属性を実行する方法

  10. 10

    C#でYouTube APIを呼び出して、すべてのYouTube動画の再生時間を取得する方法

  11. 11

    1回の呼び出しで複数のajax呼び出し関数を実行する方法

  12. 12

    C#でタイムアウトを追加してURL呼び出しを再試行する方法

  13. 13

    C#でcURL呼び出しを行う方法

  14. 14

    時間間隔で1回Ajax呼び出しを実行します

  15. 15

    アンカータグでajax呼び出しを実行する方法

  16. 16

    実行時にデリゲートを宣言し、C#で実行時にそのメソッドを呼び出す方法は?

  17. 17

    async / awaitとtry / catchを使用して階層型API呼び出しを行う

  18. 18

    C ++とC#コードの間で呼び出しを行う

  19. 19

    一定時間待機し、最後の関数呼び出しのみを実行する方法

  20. 20

    lpEnvironmentを渡してC#でCreateProcess()を呼び出す方法

  21. 21

    PhantomJSDriverでAJAX呼び出しを実行するには?

  22. 22

    IISへの長時間実行されている呼び出しを追跡する方法は?

  23. 23

    C#で複数の非同期呼び出しを効率的に並行して実行するにはどうすればよいですか?

  24. 24

    C#のhttps呼び出しでヘッダー値を取得する方法

  25. 25

    Javaで特定の時間に実行するためにスレッドを呼び出す方法は?

  26. 26

    refを使用した関数呼び出しでのC#の実行順序は何ですか?

  27. 27

    クラス階層をトラバースするメンバー関数を呼び出す方法

  28. 28

    GrailsでQuartzジョブの開始時に関数を1回実行し、呼び出し間で変数値を保持する方法は?

  29. 29

    言語依存データを使用してPostgreSQLで階層クエリを実行する方法

ホットタグ

アーカイブ