• 締切済み

protected override について

C#でカスタムコントロールを作るときなんかに OnPaintをオーバーライドすると思うんですが、 修飾子にprotected overrideが付いてますよね? protectedであるということは、ほかのクラスからは呼べないはずです。 これでなぜオーバーライドできるのかが分かりません。 ひょっとしたらものすごく簡単な答えかもしれませんが、教えていただきたいです。

みんなの回答

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

protected は、派生クラスに対して公開ですから、 カスタムコントロールは、元のクラスを派生して作りますからOKです。

関連するQ&A

  • なぜprotected overrideなのか

    C#でわからないことが2,3あるのですが、このmsndのサンプルで public class FirstControl : Control{ public FirstControl() {} protected override void OnPaint(PaintEventArgs e) { // Call the OnPaint method of the base class. base.OnPaint(e); // Call methods of the System.Drawing.Graphics object. e.Graphics.DrawString(Text, Font, new SolidBrush(ForeColor), ClientRectangle); } } これのprotected override void OnPaint(PaintEventArgs e){} の部分なのですが、なぜprotected overrinde修飾子なのでしょう 何をオーバーライドしてるのですか?他のサンプルにも構文のように出てくるのですが。 あとOnPaintはメソッドのようですがイベントを発生させるにはデリゲートではないのでしょうか あとPaintEventArgsはクラスということですがnewはいらないのでしょうか。staticがどこかにあるのでしょうか よろしくお願いします。

  • 修飾子 private protected

    Java での話です。 自分自身とサブクラスからのみアクセスできる変数は作成することはできないのでしょうか。修飾子 private protected の組み合わせは廃止されたようなのですが。 C++ だと、protectedで良かったと思うのですが、Java では同一パッケージからアクセスできるので戸惑ってしまいました。

    • ベストアンサー
    • Java
  • 仮想メソッドをoverrideすると怪しい動作

    こんにちは。C#で仮想メソッドの勉強をしています。Form1でボタンを押すとフォームが閉じるメソッドを書きました。 Form2でoverrideしてメッセージボックスを表示するようにメソッドを再定義しました。 ここで問題なのですが、Form2でcmdCloseボタンをクリックすると「閉じます」というメッセージを表示した後に、もう一度「閉じます」というメッセージが表示されます。 2回メッセージが表示されるのが腑に落ちなく、何が原因なのかお教え頂きたく思います。よろしくお願いします。 Form1 /******************************************************************************/ // フォームクローズ /******************************************************************************/ protected virtual void cmdClose_Click(object sender, EventArgs e) { this.Close(); } Form2 /******************************************************************************/ // フォームクローズ /******************************************************************************/ protected override void cmdClose_Click(object sender, EventArgs e) { MessageBox.Show("閉じます"); }

  • c# OnPaintメソッドが呼び出されない原因

     こんにちは、c#初心者です。  コントロールで描画を行う際、そのほとんどをOnPaintメソッドに頼っているのですが、ちょっと問題が発生しました。  通常、ControlクラスのTextプロパティに現在とは異なる値を設定すると結果としてOnPaintメソッドが呼ばれるのですが、ある条件下では呼ばれないこともあるみたいです。  前提条件として、 ・通常はOnPaintメソッドが正常に呼ばれる、 ・Visibleはtrue、 ・画面上に表示されている(画面内かつ上に何も覆われてない)、 ・Textプロパティはオーバーライドされていない、 ・その他、OnTextChangedメソッドとAutoSizeプロパティくらいしかオーバーライドされていない、 ・SuspendLayoutが原因ではないような気がする、 という状態なのですが、呼ばれない場合があるようです。ブレイクポイント+ステップイン/オーバーも疲れて、これ以上してたら死にそうです。  そこで皆様に考えうる原因を列挙して頂きたいのです。  単にOnPaintメソッドを必ず呼びたいのなら、最悪、Refreshメソッドなどを使えばいいのですが、それとこれとは別問題で、知識として蓄えておこうかと。  それと、対処療法的(原因ではなく症状を抑える)な方法をあまりとりたくないのもあります(それだったら、まだ全くの未完成なので、構造ごと変えてもいいのですが)。  どなたか分かる方、いらっしゃいましたら教えていただけませんか?

  • オーバーライト、それとも、オーバーライド?

    C++で、スーパークラスで定義されている関数を 継承したクラスで定義しなおすことをオーバーライトと いうのでしょうか? それとも、オーバーライドと いうのでしょうか? override と overwrite を辞書で調べてみたんですが、 どちらも、よく似た意味のようで…。 よろしくお願いします。

  • virtual時のoverrideとnewの違い

    C#で、 virtualがない時はnewしか使えませんが、 virtualがある時はoverrideとnewが使えますが、 overrideとnewを使った時の違いがよく分かりません。 例えば、基本クラスに public virtual void show(){  Console.WriteLine("基本クラス"); } というメソッドがあるとして、 派生クラスで、 public override void show(){  Console.WriteLine("派生クラス"); } とすると、 基本クラスのメソッドが上書きされて、 Console.WriteLine("派生クラス"); が実行されますが、 派生クラスで、 public new void show(){  Console.WriteLine("派生クラス"); } とした場合にも、 基本クラスのメソッドが隠匿されて、 Console.WriteLine("派生クラス"); だけが実行されます。 virtual使用時において、 継承メソッドの隠匿(new)と、 継承メソッドの上書き(override)では、 一見、なにも違いがないように見えるのですが、 何か違うのでしょうか。

  • カスタムアノテーションとは何の役に立つのでしょうか?

    はじめまして。 質問があります。 現在参考書でカスタムアノテーションについて学習しているのですが、 何に役立つのかよくわかりません。 ただ単なる注釈みたいなものでしかないのでしょうか? そこら辺のことがわからず、質問しました。 例えば、@Overrideはオーバーライドする側のメソッドの先頭に 付けることにより、正しくオーバーライドしていなければ、エラー にするという役割があります。 どうかご教授お願いします。

    • ベストアンサー
    • Java
  • C++ protectedにアクセス不可

    C++でお聞きしたいことがあります。 初心者ですのでご容赦ください。 //基本クラス class a1 { protected: a1(); }; //派生クラス class a2 :public a1 { protected: a2():a1(){}; //継承先以外から作成されたくない int t; }; class a3 : public a2 //a2を継承 { public: a3(); ~a3(); private: a2* a; //a2のポインタを持つ }; a3::a3() { t = 3; a = new a2; //コンストラクタの中でnew } a3::~a3() { delete a; //終わったらdelete } int main(void) { a3 a; return 0; } というソースでa3はa2を継承しています。 ですのでa2のprotectedメンバtにアクセスできるはず。 ここまではいいのですが、 a2のコンストラクタもa3でアクセスでき無いのでしょうか? a3のコンストラクタでnewしようとすると error C2248: 'a2::a2' : protected メンバ (クラス 'a2' で宣言されている)にアクセスできません。 a2::a2' の宣言を確認してください。 というエラーが発生します。 やりたいのはa2のような基本クラスが6つほどあり、 a2のメンバ変数が多いので コンストラクタの引数で指定されたものだけ コンストラクタないでnewしたいのです。 なぜ、できないのか? どうすればnewできるようになるのか…。 非常にお手数ですが、 どなたかご回答いただけませんでしょうか? 長文になりましたが、宜しくお願いいたします。

  • 派生クラスから基本クラスprotectedメンバへのアクセスについて

    C++初心者です。 以下のような基本クラスcoordと、その派生クラスquadがあり、quadクラスに関して=演算子をオーバーロードしました。 class coord { protected: int x, y; }; class quad : public coord { public: quad operator=(coord &ob2); }; quad quad::operator=(coord &ob2) { x = ob2.x; y = ob2.y; } するとob2からxにアクセスできないとエラーが出ます。 quadクラスのメンバ関数内なので、基本クラスのprotectedメンバにはアクセスできると思ったのですが、違うのでしょうか。 ご教授お願いします。

  • C#でキーイベントとボタンなどのコントロールを両立する方法

    引き続き質問させていただきます。 一つのフレームでキーイベントを取得(protected override void OnKeyDown)する方法を用いながら、ボタンなどのコントロールも 使用するにはどうすればよいでしょうか。 現行では、ボタンを貼り付けた瞬間に OnKeyDownが反応しなくなってしまいます。 なにとぞよろしくお願いいたします。

専門家に質問してみよう