1 名前:デフォルトの名無しさん [2009/01/20(火) 21:47:33 ] このスレッドは 「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。 ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問など、 勇気をもって書き込んでください。 内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。 >>980 を踏んだ人は新スレを建てて下さい。 >>980 が無理な場合、話し合って新スレを建てる人を決めて下さい。
684 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 22:38:00 ] >>680 クロージャは実際には一つのメソッドを持ったインターフェースを 実装したオブジェクトを簡易に作り出す機能だけど それさえあればオブジェクト指向の抽象化は全部出来る オブジェクト指向の継承にまつわるややこしいところはすっ飛ばして そっちに行くのが今は正解なんじゃないかねえ
685 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 22:39:36 ] また変な主義者が来ましたねw
686 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 22:44:52 ] >>684 それって、昔の1ファンクション1機能の構造化プログラミングと同じじゃないの? 静的なメソッドとは何がちがうのけ?
687 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 22:53:45 ] 相談があります。 C#でプログラムを作り始めて半年くらいになります。 ようやく身の回りのソフトは、だいぶ自作できるようになってきました。 ところで、それをリリースしようと思うと、プログラムのなかに直接書いてあるパスワードなどを設定ファイルに移動したり、自分用のディレクトリ構造にあわせて作った部分を汎用にする必要が出てきます。 それはまあやる気になればできそうなのですが、設定不要のかんたんなソフトを知人10人ほどにテストしてもらったところ、だれひとりとして.NETを入れていないため、動作しなかった、ということがわかりました。 ひょっとして、.NETやC#って、すごくマイナーなんでしょうか。 このままC#をつづけた方がよいのか(けっこう使いやすくて気に入ってます)、それとも別の言語に移ったほうがよいのか。 移るとしたら、もっとメジャーな言語ってなんですか? Webベースのプログラムとか、Ajaxとかですか? .NETを組み込んだ状態でコンパイルするとかできないんですかね〜?
688 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 22:55:38 ] WebでできるようなことならSiilverlightというのがある イメージ的には「C#で書けるFlash」 ランタイムは超小さいので配布が手軽
689 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 22:57:55 ] だからクロージャとインターフェイスは代替関係にないってw ただ一部の機能が競合関係にあるだけ。 たぶん従来ICompareをわざわざ用意していたようなのがデリゲートでスッキリ 書けるようになった、みたいな例を見て短絡したんだろうけど。
690 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 23:03:14 ] >>687 .netFrameworkをインストールしないって人は多いよね vista以降は.netはインストされてるから、ある程度は問題なくなると思うけど なんのインストもなくて利用可能なのは、VisualStudioのC++のネイティブコードか、 Delphiぐらいじゃないのかな。
691 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 23:13:21 ] しつもんです。 クラス内のメンバの初期化はどこでしてますか? 宣言時に初期化してしまうか、コンストラクタ内で初期化するか迷ってます。 ///以下抜粋 internal sealed class 通信 { private UdpClient UDP; private Thread スレッド; private List<byte[]> 受信リスト= new List<byte[]>();///宣言時か private List<IPEndPoint> クライアントリスト= new List<IPEndPoint>(); public 通信(int ポート) { UDP= new UdpClient(ポート);///コンストラクタ内か スレッド = new System.Threading.Thread(new System.Threading.ThreadStart(受信)); ///抜粋以上
692 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 23:18:16 ] >>691 基本は宣言時じゃないかな。 コンストラクタでもいいけど、コンストラクタをオーバーロードしているときには、 複数のコンストラクタで初期化しなくちゃいけなくなるから。 別のメソッドを用意して、そこで初期化してもいいけど、意味ない気がするし。 条件によるけど。
693 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 23:18:50 ] C#, C♯, C#相談室 Part50 pc11.2ch.net/test/read.cgi/tech/1229661915/ 埋まったけど立てられなかった。 誰か頼む。
694 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 23:22:33 ] ホスト規制のためNGですた。
695 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 23:22:51 ] >>693 あっちは相談室と名乗りながら、 質問の揚げ足を取って悦に浸っている常連ばかりだから嫌い
696 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 23:23:14 ] >>686 Cとの比較で言うと、クロージャは「状態のある関数ポインタ」といえると思う Xの値が欲しい時に void Hoge(Func<int> getX){ int x = getX(); } C#ならこう書ける。getXにはintを返す関数がなんでも入れられるしその場で作れる Cで書くと struct Func_int{ int (*func)(void*); void* args; }; void Hoge(Func_int fi) { int x = fi.func(fi.args); } こんなんだけど引数の型も作らなきゃいけないし関数はvoid*をとらなきゃいけないしで大変だ オブジェクト指向で書くと class Func<int> : IFunc<int> { int x, y; public Func(int x, int y){ this.x = x; this.y = y; } public int Method(){ return x + y; } } クロージャだと Hoge(() => x + y); こうだ。 これが進化だよ。
697 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 23:25:53 ] >>695 でも作っとかないと、そういう人らがここに常駐されたら困る
698 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 23:31:25 ] >>691 その前になんちゅうソースだコレ。
699 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 23:31:36 ] >>697 心配無用 既に常駐してる
700 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 23:36:15 ] まあとりあえず立てた。 C#, C♯, C#相談室 Part51 pc11.2ch.net/test/read.cgi/tech/1233757615/l50
701 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 23:36:42 ] >>696 その例だと従来の方法でもStaticなメソッドを使えば int x = Class.Method(a, b); で代用がきくから同じことだと思うんだけど。何が違うの?
702 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 23:37:33 ] 読解性
703 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 23:40:36 ] >>690 VC++ も今は CRT が DLL 推奨だから配るならインストーラ作るべき なんやけどな。msm があるしサイズも小さいので格段に楽だから .NET と比べるレベルじゃないけど。
704 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 23:42:54 ] 自分の場合は固定長バッファ持たせる時とか、ソース直書きのデータを持たせる時以外は宣言の所に初期化コードを書かないようにしてる。 基本的にはできるだけコンストラクタに書いたほうが、読みやすいコードになるよ。 #regionと組み合わせるとなお良い。 指すものがコンパイル時点で決まっていて、利用者側のコードに左右されない要素(リテラル的なもの)は宣言と初期化を一緒にしてもいいと思う 上の固定長バッファはあてはまらないけど…
705 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 23:44:00 ] >>687 「.net Frameworksインストールしてね」で終わりじゃないか? むしろ、Windows Updateで配布されてるんじゃないのか?.netぐらい
706 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 23:45:31 ] >>700 乙
707 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 23:47:58 ] >>687 「めんどくせえなぁ・・・なんでこんな糞プログラムを・・・。そうだ!インストールしてない事にすればいいんだ!」
708 名前:デフォルトの名無しさん [2009/02/04(水) 23:49:28 ] >>701 void Hoge() { int x = Class.Method(a,b); } これだとxはMethod(a,b)から返ってくる値しかとれないでしょ。 void Hoge(Func<int> getX) こうしておけば Hoge(() => x + y); Hoge(() => x * y); 外部から自由な演算を入れられる。 ハッシュテーブルのキーが欲しいということになっても Dictionary<TKey, TValue> CreateDictionary<TKey, TValue>(TValue[] array, Func<TValue, TKey> getKey) { Dictionary<TKey, TValue> dic = new Dictionary<TKey, TValue>(); foreach(var item in array) { dic.Add(getKey(item), item); } return dic; } var dic = CreateDictionary(array, item => item.Name); その型のKeyにしたいものを自由に選べる
709 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 23:52:03 ] .NET Frameworkは再頒布可能だからその自作ソフトとやらに含めて配布すればいいんだよ。 msdn.microsoft.com/ja-jp/library/xak0tsbd.aspx ちなみにWindows Server 2003、Windows Vista、Windows 7にはリリース時点で最新の.NET Frameworkが入っている。(より新しいバージョンが出て、それが必要な場合は更に入れる必要がある)
710 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 23:53:57 ] はやくXPが駆逐されればいいんだがなあ
711 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 23:57:24 ] デザインパターンは関数型っぽいことを無理やり手続き型OOPLでやるための工夫が主だから かなり簡単に実装できるよな
712 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 23:58:26 ] >>708 それみると、君の主張するところの直感的でもないし、 初心者にもわかりにくいと思うよ
713 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 00:02:11 ] >>712 じゃあオブジェクト指向や構造化でもっと直感的に、 初心者に分かりやすく書ける?
714 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 00:04:46 ] スレ違い よそで存分に議論してくれ
715 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 00:05:14 ] 初心者ではないが、何が書いてあるかさっぱりだw
716 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 00:07:06 ] 人の揚げ足取りと議論厨は相談スレにお引き取りください
717 名前:デフォルトの名無しさん [2009/02/05(木) 00:07:42 ] すみませんコレは仕様なんでしょうか 1:public class Foo{ 2: private readonly int[] test = new int[]{1,2,3,4,5}; 3: public Foo(){ 4: int[] test2 = test1; 5: test2[0]=2; 6: Console.WriteLine(@"test[0]=" + test[0].ToString()); 7: } 8:} 上記 2行目readonlyにしてるtestが、5行目で書き換えられてしまいます。
718 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 00:09:03 ] >>708 じゃねーけど知りたいんならレキシカルクロージャとかで ぐぐった方がいいと思うよ。 >>708 2ch で説明するのはさすがに難しいと思う
719 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 00:09:15 ] 4: int[] test2 = test; のまちがいです
720 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 00:09:37 ] 配列の要素がreadonlyになるわけではありません
721 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 00:14:31 ] >>718 2chで説明するのが難しいことが、初心者向けなの?
722 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 00:15:02 ] >>718 ググっても関数型言語ユーザーの宗教じみた言論に圧倒されるばかりだと思う
723 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 00:18:22 ] >>701 匿名関数は生成したスコープの変数をそのまま取り込める(環境を渡してるって言うんだっけ?) 副産物的な物だけど、遅延評価的な振る舞いも持ち合わせてる
724 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 00:19:56 ] この辺の議論からもう13年か。 ttp://java-house.jp/ml/archive/j-h-b/001955.html ttp://www.google.co.jp/search?hl=ja&q=%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3+interface+site%3Ajava-house.jp >>718 むしろ近年のクロージャブームはLLの方が先に火をつけた気もするけどね。 JavaScriptの無名関数とかやっぱり初心者泣かせなのかねぇ?
725 名前:723 mailto:sage [2009/02/05(木) 00:21:07 ] ごめんさっきの >>718 あてじゃなくて >>722
726 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 00:31:46 ] 何々、これでいいじゃん? public static class Class { static int i; public static int Method() { return i++; } }
727 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 00:37:50 ] >>726 でもさ、C#でクラスそのものを引数に渡すって面倒事が多いでしょ。 だからデリゲートでもインタフェースでもインスタンスを生成して引数に渡していたのに。
728 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 00:41:24 ] クラスそのものって引数に渡せるの?
729 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 00:41:29 ] >>727 staticだからclassそのものを渡す必要なんてないよ どこでも自由に this.label1.Text = Class.Method().ToString(); でいいんじゃない?
730 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 00:43:56 ] >>728 private void button1_Click(object sender, EventArgs e) のobjectはクラスじゃん?
731 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 00:48:04 ] objectはインスタンスだろ
732 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 00:48:56 ] ocjectはクラス名だ
733 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 00:49:27 ] object
734 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 00:50:41 ] この場合は話の流れからインスタンスってことじゃねーの?
735 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 00:51:26 ] public class Class { int i; public int Method() { return i++; } } これの方がいいだろ たくさん作れるし
736 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 00:54:51 ] >>734 この流れって話の本筋なわけ?
737 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 00:56:27 ] >>729 それだと元のコードの引数を変えれば動作を変えられるという点が失われているじゃないか。
738 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 01:34:39 ] >>737 その引数を、Staticなメソッドで渡してあげればいいじゃない public static class test { static int i; public static int Method1() { return i++; } public static void Method2(int k) { i = i + k; } }
739 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 01:36:47 ] >>738 いや、>>708 とか足し算が掛け算になったり、辞書引いたりするような変化なんだけど。
740 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 01:45:46 ] >>739 つまり >だからデリゲートでもインタフェースでもインスタンスを生成して引数に渡していたのに。 というのは >708とか足し算が掛け算になったり、辞書引いたりするような変化なんだけど。 と同義ということ?
741 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 01:58:26 ] C#でCreateToolhelp32Snapshot関数を使いたいのですが、どう書けばいいのか分かりません。 .NET Frameworkに似たようなクラスライブラリはありませんか?
742 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 02:41:42 ] >>741 89.234.50.65/default.aspx/kernel32/CreateToolhelp32Snapshot.html
743 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 02:43:11 ] pinvoke.net/default.aspx/kernel32/CreateToolhelp32Snapshot.html
744 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 03:24:45 ] >>740 いや、同義というより1つの具体例と言うべきかな。 >>696 みたいに別の場合だってある。
745 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 04:17:38 ] >>732 objectはキーワードだ
746 名前:デフォルトの名無しさん [2009/02/05(木) 06:18:49 ] C#でアルファベットをfor文のループにかけてAからZまでを表示したいのですが、うまくいきません。 どのようにすればfor文でアルファベットを数値のようにAからZを表示する事が出来るのでしょうか?
747 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 06:20:05 ] >>746 一番分かりやすいのは配列にすればいいと思うよ
748 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 06:22:37 ] for(int i=0;i<26;i++) Console.WriteLine((char)('A'+i));
749 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 06:47:26 ] for(char c = 'A'; c <= 'Z'; c++) Console.WriteLine(c);
750 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 09:26:15 ] >>740 > >>739 > つまり > > >だからデリゲートでもインタフェースでもインスタンスを生成して引数に渡していたのに。 > > というのは > > >708とか足し算が掛け算になったり、辞書引いたりするような変化なんだけど。 > > と同義ということ? >
751 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 09:31:27 ] >>740 インスタンスを作ることでコンテキストの別な関数オブジェクトができる(イベント処理の時にstaticだとマズいだろう) 値を変えるのと振る舞いを変えるのとでは大違いだし… デリゲート(委譲)はその名の通り、実行するタイミングを相手に委ねてる 渡すことを意図しているのは値(狭義の)ではなく動作
752 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 14:00:29 ] Form1からForm2をShowDialogした場合、 Formが描画される際に画面の上から順に 貼り付けてあるコントロールが表示される感じで、 Closeする場合も同様にもっさり感があるのだが、回避する方法はある? ちなみにForm2がLoadされるとDataGridViewにMDBから データを読込んで表示させているのだけど。
753 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 14:15:24 ] それはビルドした実行ファイル?デバッグ?
754 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 14:17:26 ] >>753 デバックでも実行ファイルでも描画速度にあまり変化がない感じ・・・
755 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 14:20:02 ] 実行環境は?
756 名前:デフォルトの名無しさん [2009/02/05(木) 14:20:35 ] >>752 描画を手動でやる ↓ソース開始↓ [コントロール名].SuspendLayout() //コントロールの描画停止 //(この間に処理を書く) [コントロール名].ResumeLayout() //コントロールの描画再開 ↑ソース終了↑ コントロール名をthisにすればForm全体の描画を停止できる
757 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 14:20:44 ] それはGUIの設計に問題があるね フローレイアウトパネルにコントロール配置してFillしたりAnchorしたり 推奨されてないことやってないだろうね?
758 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 14:21:41 ] 素人発言だけどSuspendLayoutとResumeLayoutとか?
759 名前:752 mailto:sage [2009/02/05(木) 14:36:21 ] 実行環境はXPでCelelon2G・メモ1G VS2008でつ。 GUIの設計はVB(.Netじゃないヤツ)みたいに Formにコントロールを貼り付けるだけではダメなのかしら? Formにあるのは、DataGridViewとButtonとTextBoxとLabelだけ。 DataGridViewコントロールを外して純粋にFormだけでShowすると 幾分早く描画されるって事はDataGridViewの処理が適切でないのかな? 今から756氏と758氏を参考に試してみます。 みんな優しいな。ありがたい!
760 名前:デフォルトの名無しさん [2009/02/05(木) 14:47:04 ] DataGridViewに対してデータセットをバインドさせると早くなるよ〜 それでも遅いのならSQL文を見直すしかない
761 名前:752 mailto:sage [2009/02/05(木) 15:01:31 ] SuspendLayoutはあまり変化がなかった・・・ _| ̄|○ 今は、OleDbConnection使ってMDBへ接続しているんだけど、 もっと早い方法はあるんですか? SQL文に関しては単なるSELECT文なのでどうにもならないと思われ。。
762 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 15:02:32 ] データのバインドを直接じゃなくBindingSourceに任せてみたらどうだろう こういう症状はあまり経験も聞いたこともないけど
763 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 15:08:40 ] あれ?もしかしてDataSetなし?
764 名前:752 mailto:sage [2009/02/05(木) 15:09:40 ] >>762 早速試してみる! VB6から移行してきた口なんだが、勝手が違い過ぎて戸惑いすぐる。
765 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 15:14:45 ] DataSetはあります。 コードはこんな感じ(抜粋) strSelectSQL(変数)へSELECT文を入れてます。 dba = new OleDbDataAdapter(strSelectSQL, dbc); OleDbCommandBuilder builder = new OleDbCommandBuilder(dba); dba.Fill(dtset); dataGridView1.DataSource = dtset.Tables[0];
766 名前:752 mailto:sage [2009/02/05(木) 15:15:47 ] >>765 名前入れ忘れたが、752です。
767 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 15:18:28 ] CommandBuilderからdatasetまで全部動的か
768 名前:752 mailto:sage [2009/02/05(木) 15:36:30 ] bindingSourceを追加してみたけど、速度は劇的に早くならなかった。 実行速度はこの位って事で満足したことにまつ。 なんか引っかかるけど・・・ ところでbindingSource下記で使い方間違ってない?? dba = new OleDbDataAdapter(strSelectSQL, dbc); OleDbCommandBuilder builder = new OleDbCommandBuilder(dba); dba.Fill(dtset, "TEST"); bindingSource1.DataSource = dtset; bindingSource1.DataMember = "TEST"; dataGridView1.DataSource = bindingSource1; 教えて君で非常に申し訳なかったです。
769 名前:760 [2009/02/05(木) 15:36:38 ] 動かしてないんでご両所くださいw すべて妄想ですw ↓ソース開始↓ OleDbConnection odc = new System.Data.OleDb.OleDbConnection(); OleDbDataAdapter odda; DataSet ds = new DataSet("GetData"); //データセットの名称を指定 //接続情報を指定 odc.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source = " + @"\DUMMYDATA.mdb"; //実行SQL文と接続先情報を設定してアダプタを作成 odda = new OleDbDataAdapter("SELECT * FROM DUMMYDATA", odc); //データを取得しテーブルを作成 //テーブル名称を設定(任意) odda.Fill(ds, "tm_DUMMYDATA"); //データソースに設定 dataGridView1.DataSource = ds.Tables["m_DUMMYDATA"]; //インデックス値でもいい ↑ソース終了↑ いろいろ勘違いしてたらごめんね 反省はしないけど
770 名前:752 mailto:sage [2009/02/05(木) 15:44:25 ] >>769 ソースまで書いてもらって、しかもコメント付で!! ほんとに親切にありがとう。 素直にうれしす。
771 名前:636の者です。 mailto:sage [2009/02/05(木) 16:40:08 ] コンストラクタについての質問です。 クラスが3つあります。クラスBは3つコンストラクタがあります。 ClassA { ClassB b = new ClassB(〜); } ClassB { public ClassB(N n){} public ClassB(N n, M n){} public ClassB(N n, M m, O o){} } ClassC { ClassB b = new ClassB( ); b.〜 } クラスAからクラスBを呼び出すときは、if文で分けてコンストラクタを1つだけ呼び出すことが できたのですが、クラスCからクラスBを呼び出すときはどのように呼び出したら良いでしょうか?
772 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 16:42:45 ] こっちが聞きたい ClassAとClassCは何が違うんだ
773 名前:636の者です。 mailto:sage [2009/02/05(木) 16:47:41 ] >>772 クラスAのwindowフォームからクラスBのwindowフォームを呼び出すんですが、 そのクラスBのフォームの選択欄を別のクラスCで使いたいのです。
774 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 16:49:37 ] それがどうした >>772 の答えになってないだろ
775 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 16:51:35 ] だったら class A() { public B b; C c; public A(){b=〜;c=C(this)} } public class C() { public C(A a){} } とかじゃだめ?
776 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 16:52:32 ] >>771 逆に聞く。 ClaaAからClassBを呼んだときと同じように、ClassCからClassBを呼ぶとどうなったんだ?
777 名前:636の者です。 mailto:sage [2009/02/05(木) 16:59:15 ] >>776 コンパイルエラーはでないのですが、 クラスCでは、クラスBの変数を呼び出しても未定義となってしまいます。
778 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 17:02:16 ] いいから失敗したコードを晒せ
779 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 17:03:42 ] >>777 確認だが、同一form(B)の情報をAとCで共有したいってことでいいの? だったら両方でnewしてるから 今のコードだったら、AとCがそれぞれ別のform(B1,B2みたいな)を持ってることになる。 違うなら、そもそもやりたいことが分からん。
780 名前:636の者です。 mailto:sage [2009/02/05(木) 17:13:57 ] >>779 クラスAで入力したテキストの個数によってクラスBのコンストラクタをShow()を使って 1つ呼び出すだけですが、クラスBではリストボックスなどをSelectedItemで選んで、 その選んだ項をクラスCで使いたいのですが、クラスCでクラスBの変数を使いたいときに、 クラスBのインスタンス化を行うときに、どのコンストラクタを選択すればよいのかが分かりません。
781 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 17:25:00 ] 禅問答みたいw
782 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 17:33:58 ] たぶんVB脳、それも極上のやつなんだと思う
783 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 17:47:52 ] 小文字は大文字クラスのインスタンスだとする。 (1) a → b1 c → b2 (2) a → b ← c どっちなんだ ちなみに(1)はフォームが2つできる。そしてb1とb2は別物だからリストボックスなんかの情報は共有できない。 俺には(2)を実現したいのに(1)のコードを書いちゃってるように見えるんだが・・・
784 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 18:16:59 ] なんか、他のクラスを呼び出すときはNewしなきゃいかんという間違った固定概念をお持ちなのでしょう