• ベストアンサー

ソフトの組み方は文法書を読んでもなかなか理解できない C#

C#でクラスの事と、組み立て方がまだ理解できていないのですが class Dousa{ } class Form1 の2つのクラスがあります。 プログラムを実行するとForm1から動作します。(まだこの仕組みが理解できていないですが) そして、フォームが表示され、ボタンが配置されているのでそのボタンをクリックすると、 Dousaのオブジェクトがインスタンスされて実行されるようにしているのですが、 そのDousaクラスの中で、円を描くメソッドを動かすとForm1上で円が描かれるといったことをしたいのですが、 円を描くメソッドは、Form1のこと(メソッド)を知らないと描けないと思う(?) class Form1 : Dousa;の場合は Dousaの中身がForm1に継承されるのですが、 逆のことがしたいです。 class Dousa : Form1とした場合、最初に実行されるエントリ?はどこからになるのでしょうか? Form1から動作しても、DousaクラスからForm1をいじれるようにする仕組みは作れるのでしょうか? このようにソフトの組み方は文法書を読んでもなかなか 理解できないところですが、C#を使ったのソフトの組み方を解説している本などご存知の方教えていただきたいです。

  • binma
  • お礼率14% (11/78)

質問者が選んだベストアンサー

  • ベストアンサー
  • dekopa-
  • ベストアンサー率42% (161/378)
回答No.2

>プログラムを実行するとForm1から動作します。(まだこの仕組みが理解できていないですが) プロジェクト内で'Application.Run'を検索すると見つかるはずです。Application.Run(new Form1); 実際は、Run()の中で無限ループしています。その途中、ボタン操作などのユーザー入力を検知し、ButtonClickedイベント等が呼ばれます。 >そのDousaクラスの中で、円を描くメソッドを動かすとForm1上で円が描かれるといったことをしたいのですが、 >円を描くメソッドは、Form1のこと(メソッド)を知らないと描けないと思う(?) 正確には、Form1のGraphicsオブジェクトが円を描くのですが。 きちんと描画するなら、Form1.OnPaint()イベントを定義し、OnPaintの引数にあるGraphicsオブジェクトを、そのイベント内で生成したDousaオブジェクトに渡しましょう。 ボタンは、描画する/しないを切り替えます。 コード #ボタンは適当に配置して下さい。ボタンのClickedイベント、フォームのPaintイベントを以下のように定義します。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace WindowsApplication1 { public partial class Form1 : Form { private bool draw = false; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { draw = !draw; Invalidate(); } private void Form1_Paint(object sender, PaintEventArgs e) { if (draw) { Dousa d = new Dousa(); d.Draw(e.Graphics); } } } } using System; using System.Collections.Generic; using System.Text; using System.Drawing; namespace WindowsApplication1 { public class Dousa { public void Draw(Graphics g) { Pen p = new Pen(Color.Black); g.DrawEllipse(p, 30, 30, 100, 100); } } } 後は、参考サイトなどを読んで多くのサンプルを読みましょう。

参考URL:
http://www.atmarkit.co.jp/fdotnet/dotnettips/index/index.html
binma
質問者

お礼

参考になるソースありがとうございます。 手書きで private void Form1_Paint(object sender, PaintEventArgs e) { if (draw) { Dousa d = new Dousa(); d.Draw(e.Graphics); } } } とすると、無反応でしたが、 Form1.csに以下のように記述すると動作しました。 Form1_Paintは手書きだけでは動作しないのでしょうか? protected override void OnPaint(PaintEventArgs e) { if (draw) { Dousa d = new Dousa(); d.Draw(e.Graphics); } }

その他の回答 (2)

  • dekopa-
  • ベストアンサー率42% (161/378)
回答No.3

#2です。 >Form1_Paintは手書きだけでは動作しないのでしょうか? 掲載したコードだけでは足りないのです。VisualStudioが自動生成しているコードが必要です。 VisualStudioのバージョンによって場所が変わるのですが、仮にVisualStudio2005かVisualC# 2005 ExpressEditionなら、Form1.Designer.csに this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint); というコードがあるはずです。(普段は隠されているので、"Windows フォーム デザイナで生成されたコード"という部分をダブルクリックするか、左側の+マークをクリックして下さい) これが、フォームがPaint処理を呼ぶ時に呼び出されるイベントの定義です。 Application.Run()の中でForm1の画面が再描画されるとき、Paint()が処理されます。この時、イベントが割り当てられていればそのコードを呼び出します。 こういうイベントを割り当てるコードを自分で書けば、「手書きだけで動作する」プログラムも作れます。 C#は、必要な事は基本的に生成されたコード内に書いてありますから、自動生成された.csファイルに全部目を通してみましょう。

回答No.1

コンピュータやプログラミングの本の専門書は結構値段が高いものが多いので、私は県や市の図書館で見たり借りたりしています。最新でない場合もありますが、基本的な事は同じなので、私は十分だと思いますがどうでしょうか?

関連するQ&A

  • 継承・実装の関係で悩んでいます。

    継承・実装の関係について悩んでいます。 ここでは、アクセス制御を考えずに、インスタンスかstaticかabstract(ここではabstract final staticやabstract classのこと)の違いで、どう継承するのか考えています。 // 継承 はメソッドのオーバーライドのことを考えます。(オーバーロードは考えない) クラスAからクラスBでオーバーライドしたメソッドは、 クラスCでさらにオーバーライドできるのでしょうか? クラスCが クラスBのクラスAからオーバーライドしたメソッド をクラスBのメソッドとして見たときに、オーバーライドすることは可能なのでしょうか? クラスA │ インスタンスフィールドA │ staticフィールドA │ │ クラスA() { } │ │ インスタンスメソッドA () { } │ staticメソッドB() { } ↓ クラスB extends クラスA │ インスタンスフィールドA // 継承 │ インスタンスフィールドB │ staticフィールドB │ │ サブクラス1() { } // コンストラクタは継承しない、super()で呼び出す │ │ インスタンスメソッドA () { } // 継承 │ │ インスタンスメソッドB () { } │ staticメソッドB () { } ↓ クラスC extends クラスB implements インタフェースD, ... ↑ インスタンスフィールドA // クラスBのフィールドを継承 │ インスタンスフィールドB // クラスBのフィールドを継承 │ インスタンスフィールドC │ staticフィールドC │ │ サブクラス2() { } │ │ インスタンスメソッドA () { } // クラスBのメソッドを継承 │ インスタンスメソッドB () { } // クラスBのメソッドを継承 │ インスタンスメソッドD () { } // インタフェースDのメソッドを実装 │ インスタンスメソッドE () { } // インタフェースDのメソッドを実装 │ │ │ インスタンスメソッドC () { } │ staticメソッドC() { } │ interface インタフェースD extends インタフェースE ↑ │ staticフィールドD // public static final │ │ インスタンスメソッドD() { } // public abstract │ インスタンスメソッドE() { } // 継承 │ interface インタフェースE staticフィールドE // public static final インスタンスメソッドE() { } // public abstract

    • ベストアンサー
    • Java
  • C++で参照カウンタを実装したいのですが

    こんにちは。 C++でクラスに参照カウンタを実装したいのですが、もしも実装する場合、 class CRefCounter {   参照カウンタとAddRef、Releaseメソッドを仮想メソッドとして実装 }; このクラスを継承して直接使う方法と、 class IRefCounter {   参照カウンタとAddRef、Releaseメソッドを純粋仮想メソッドとして宣言 } このクラスを継承して継承側で実装する方法とがあると思うのですが普通はどちらを使うものでしょうか?

  • スーパークラスからサブクラスのメソッドを使おうとする、以下のプログラム

    スーパークラスからサブクラスのメソッドを使おうとする、以下のプログラムでつまずいています。 Aを継承したB、Cクラスのインスタンスを作成し、スーパークラスであるA型の配列asにまとめます。 それからループでas[i]にはいっている各インスタンスのメソッドを使いたいのですが、 スーパークラスAにmethod()がないためコンパイルできません、Aにmethod()を作るとA.method()が実行されます。 BとCを同じ配列に保存し、かつそれぞれのmethod()を実行したい場合どのようにしたら良いのでしょうか。 ご教授ください、どうぞよろしくお願いします。 class Main{ private B b; private C c; private A[] as = new A[2]; void mainMethod(){ as[0] = b = new B(); as[1] = c = new C(); for(int i=0; i<3; i++){ as[i].method(); } } } class A{} class B extends A{ void method(){ System.out.print("It is B"); } } class C extends A{ void method(){ System.out.print("It is C"); } }

  • c# この高速化の方法あり? 2

     こんにちは、c#初心者です。  現在ライブラリを作成しているのですが、その中でちょっと問題がありそうな高速化の方法を思いついたので質問させていただきました。  継承させるクラスを作るときに、継承予定のクラスで実装するメソッドやメンバを、基のクラスでは public class Class1 {   internal virtual void Method()   {     throw new NotImplementedException();   } } // - - - - - - - - - - - - - - - - - - - - - - - - - public class Class2 {   internal override void Method()   {     //ここで実装   } } として、 このオブジェクト「sampleObj」があったとして、 if ( sampleObj is Class2 )   sampleObj.Method(); のようにすることで Class2 temp = sampleObj as Class2; if ( temp != null )   temp.Method(); や if ( sampleObj is Class2 )   ((Class2)sampleObj).Method(); のようにすることよりも若干高速になるようです。  末端のアプリケーションならまだ問題になりにくいかもしれませんが、今回はライブラリということなので気になっています。  気休め程度に「internal」になっていますがそれでもまずい気がします。  どなたか詳しい方がいらっしゃいましたら教えていただけませんか?

  • 指定されたクラスの継承元の確認方法

    Class cls = Class.forName("extendsClass"); Object obj = cls.newInstance(); if (obj instanceof AbstractClass) {   System.out.println("継承してた");   ((AbstractClass)obj).method(); } こんなことをして、objのクラスがAbstractClassを継承しているという ことは確認することが出来たのですが、これはやはり継承しているか どうかを確認する為にインスタンス化を行っています。 指定された名称のクラスが、特定のクラスを継承していた場合に限り、 その名称のクラスをインスタンス化する、 という流れは行えないのでしょうか?

    • ベストアンサー
    • Java
  • AWT Frameを利用するプログラムのmainメソッドを含むクラスについて

    AWTのFrameを継承してWindowプログラムを作成する際に、どんな書籍のサンプルプログラムを見ても、メインクラスがFrameを継承し、その中にmainメソッドが有って、そのmainメソッド内で自分自身のクラスのインスタンスを作成してshowする、といった事を定石のように行っています。 しかし私が思うに、mainメソッドなど含まずFrameを継承してWindow周りの処理を純粋に行うクラスを作成し、プログラムのメインとなるクラス内のmainメソッドからFrameを継承した別クラスのインスタンスを作成・showする方が、よほどスッキリして理解し易いような気がするのですが、どうなんでしょ? そういったサンプルプログラムを作成してみましたが問題なく動作します。ただそういう事をやっている他のサンプルソースが見当たらないので、何となく不安です(笑)

    • ベストアンサー
    • Java
  • 継承後のメソッドでコントロールにアクセスする方法

    よろしくお願い致します。 継承の動作を勉強しております。動作自体は確認出来ました。 継承後のメソッドでフォーム上のコントロールにアクセスする方法はありますか? 例えば「label1.text = "~"」の様に動作させたいです。 現在、2つのファイルに3つのクラス(そもそもここが間違ってる?)を書いてあります。 ----- 1つめのファイル(Formのクラス) ----- Public Class Form8  Private Sub Button1_Click(~) Handles Button1.Click   Dim c As New check1   c.test()  End Sub End Class Public Class check1  Inherits Class1  Public Overrides Sub test()   Trace.WriteLine("Overrides")   'label1.text = "動作OK"   ←こんな感じに実装したい  End Sub End Class ----- 2つめのファイル(クラス) ----- Public MustInherit Class Class1  Public MustOverride Sub test() End Class フォームクラスの外で「label1.text = ""」のように書いてもアクセス出来ないのはわかります。 フォームクラスのファイル中にもうひとつクラスを書いてしまっているのが悪いのもわかります。 この辺りをどのように実装したらよいでしょうか。 わかりづらくて申し訳ありません。 ご指導よろしくお願い致します。

  • 継承について

    下の質問の回答、間違ってませんか? -------------------------------------------- 親クラスのフィールドをメソッドを全て継承することになります。よって、サブクラス2は、サブクラス1とスーパークラスのメンバーを全て持つことになります。サブクラス2をインスタンス化すると、サブクラス1とスーパークラスが全てインスタンス化(コンピューターのメモリ上等に配置)されます。 ただ、可視性というものがあり、サブクラスから親クラスのメンバーを直接取り扱えない場合があります。privateや可視性修飾子無しの場合、サブクラスから直接取り扱えません。ただ、継承はされているので、インスタンスとしては存在します。例えば、 class スーパークラス{ private int abc; public int getAbc(){ return this.abc; } というクラスがあり、これを継承したサブクラスがあったとします。 サブクラスからは、privateなメンバー変数abcは直接取り扱うことができません。ただ、publicなgetAbcメソッドはサブクラスから取り扱えます。これで何が分かるかといいますと、privateなメンバーでもサブクラスに継承されるのです。単に可視性の問題で直接取り扱えないだけなのです。 また、オーバーライドされたメソッドがあったとしても、super.メソッド()で親のメソッドも呼べますので、これも継承されているのです。

  • C++を勉強し始めたばかりの初心者なのですが、クラスの継承に関して・・・

    Visual C++ 2008で、新しいwindowsフォームアプリケーションを作成したら、Form1.hの上の方に public ref class Form1 : public System::Windows::Forms::Form という行がありました。これは開発環境に実装されている System::Windows::Forms::Formクラスを継承し、Form1クラスを新たに作成しますという意味なのですよね? このとき、2つ目のpublicは、継承の仕方、この場合結果的にはSystem::Windows::Forms::Formクラスに含まれるメンバの、private以外がそのまま受け継がれる、という事になりますよね? それで、このref classというのは、ポインタみたいな意味でしょうか?refは書かないと別の継承方法になるのでしょうか? また、最初のpublicはどういう意味なのでしょう? もしかして、この2つについては、System::Windows::Forms::Formクラスを継承して新規フォームを作る場合の、定型みたいなものなのでしょうか?

  • [Obj-c]元クラスからサブクラスのメソッド

    Objective-Cの勉強をしています。 ClassAは元クラス(スーパークラス)です、 ClassB1、B2はClassAを継承(サブクラス)しています。 ClassAとClassB1にはiMethodというメソッドが存在します。 最下部にソースと実行結果があります。 ●そこで質問なのですが、  ClassAのインスタンスにClassB1のインスタンスをセットすると、  同じ名前のメソッドがあるだけでなぜClassB1のメソッドが呼ばれるのでしょうか?  (下記ソースの[bangai iMethod]; の部分です。)  ClassB1のインスタンスを渡すとClassAのインスタンスが  ClassB1のメソッドを使用できる理由がわかりません、  継承しているとはいえ型が違うものを参照渡しできる理由も今ひとつわからないです。  またこれはどういう機能を言うのでしょうか?  (例えば ポリモーフィズム、動的バインディングなど) ★ソース ------------------------------------------------------------------------------ #import <Foundation/Foundation.h> // ClassA @interface ClassA : NSObject { } @end @implementation ClassA -(void) iMethod { NSLog(@"スーパークラスのインスタンスメソッドです。\n"); return; } @end // ClassB1 @interface ClassB1 : ClassA @end @implementation ClassB1 -(void) iMethod { NSLog(@"サブクラスのインスタンスメソッドです。\n"); return; } @end // ClassB2 @interface ClassB2 : ClassA @end @implementation ClassB2 @end int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... ClassB1 *instance_B1 = [[ClassB1 alloc]init]; ClassB2 *instance_B2 = [[ClassB2 alloc]init]; [instance_B1 iMethod]; [instance_B2 iMethod]; // 親には子のクラスが入れられる ClassA *bangai = instance_B1; [bangai iMethod]; } return 0; } ------------------------------------------------------------------------------ ★実行結果 サブクラスのインスタンスメソッドです。 スーパークラスのインスタンスメソッドです。 サブクラスのインスタンスメソッドです。

専門家に質問してみよう