08/04/07 14:20:41
A,B.Cは最低限の共通のフィールドを持っていて,それらに対して
共通の処理を行うならプロパティを宣言したインターフェイスを作ってA,B,Cに実装する
処理の目的だけが決まっていて,フィールドをどう使うかはA,B,Cそれぞれで全く違うんだったら
その処理を行うメソッドをインターフェイスに宣言してそれをA,B,Cが実装する形にすれば
きれいかもしれないけど実装の手間は変わらん
669:667
08/04/07 14:41:39
>>668
提案ありがとうございます。
難しいですね。。。
フィールドに抽象メンバなるものを持てて、
抽象メンバ取り出しメソッドみたいなものがあって、
取り出したメンバにたいしてforeachをかける
みたいな実装できたらよかったのですが。。。
670:667
08/04/07 15:04:25
private権限でunion配列を用意し、
値そのものはこの配列に格納することにする。
フィールドのプロパティでその配列にアクセスするようにする。
実際の処理は、配列に対して行なう。
(クラスによってその配列の長さは異なる。)
で実現できそうです。
671:665
08/04/07 16:46:06
>>666
ご返答ありがとうございます。
OOPは初めてなので、きっと勘違いしていると思います。
そのようなプロパティ実装をした非static変数は、
各メソッド内でインスタンス生成してから用いると認識していますが、その場合、
たとえばグリッドコントロールが今表示している年/月を取得したりすることはできるのでしょうか?
それとも、グリッドを配置しているFormのクラス内に、
プロパティ実装した変数をフィールドとして用意するのでしょうか?
後者は、とりあえず試みてはみたものの、やはり変数をいじってもグリッドに変化が見られません。
672:664
08/04/07 16:48:07
>>671の名前欄のレス番を間違えました orz
汚してしまいすみません。
673:デフォルトの名無しさん
08/04/07 17:55:48
this.textBox1.Text = a;//aはフィールド
a = "変更した";
もしかしてこれで変更できると勘違いしてない?
674:664
08/04/07 18:02:29
>>673
思いっきりしてます!
正しくはどうすればよいのでしょうか・・・?
675:デフォルトの名無しさん
08/04/07 18:34:12
>>674
string _str;
public string Str {
get { return _str; }
set
{
sourceGrid.DateTime = value;
_str = value;
}
}
こんな感じのことがしたいの?
取得ってのは普通に
var value = souceGrid1.DateTime;
とかでいいと思うんだけども。
ソースグリッドとかいうものを使ったことないから分からんけど。
676:675
08/04/07 18:42:07
あーそうか。もしかしてソースグリッドの表示年月の変更って
プロパティじゃなくてメソッドかなんかでやってんのかな?
sourceGrid.SetMonth(value);
こんな感じで。
プロパティでなんかありそうだけどね。
面倒だがちょっと導入して試してみるか。
677:675
08/04/07 18:47:07
と思ったが、ユーザー登録が必要だということで面倒だからやめた。
とりあえず>>664はソースグリッドコントロールの年/月を取得もしくは設定しようとしている部分の
コードを晒してくれ。
取得ができないような設計にはなってないと思うんだ。
678:デフォルトの名無しさん
08/04/07 19:27:02
XmlDocument xml = new XmlDocument();
xml.Load(url);
xml["abc"]というノードがあるのか調べるにはどうしたら良いのでしょうか?
679:664
08/04/07 19:48:19
>>675さんのお話を聞くと、自分のコーディングの方向性が
根本的に間違っているような気がしてきました・・・。
ここに書き込む前は、以下のような方法で実現しようとしていました。
namespace下に以下のようなクラスを作成し、
public class CurrentYearAndMonth
{
public static int cYear;
public static int cMonth;
public static int cMonthDaysCount;
public static void SyncYM()
{
DateTime dtNow = DateTime.Now;
cYear = dtNow.Year;
cMonth = dtNow.Month;
cMonthDaysCount = DateTime.DaysInMonth(cYear, cMonth);
}
}
これに対して、グリッドを配置しているFormのForm_Loadメソッド内で、
簡潔に書くと以下のように上記の変数を使っています。
for (int r = 1; r <= CurrentYearAndMonth.cMonthDaysCount; r++)
{
grid1.Rows.Insert(r);
grid1[r, 0] = new SourceGrid.Cells.Cell(CurrentYearAndMonth.cMonth.ToString() + "月" + r.ToString() + "日");
}
この状態で、Load完了後にcMonthなどの変数値をいじってFormやgrid1をUpdate()などしてみると、
UI上の表示も変化するかなと目論んでいたんですが、やはり間違っているのでしょうか?
(ちなみに、SourceGridは
URLリンク(sourceforge.net)
からダウンロードできます。)
680:664
08/04/07 19:50:46
追記です。
CurrentYearAndMonth内のSyncYM()メソッドは、OSの現在時刻と合わせるためのもので、
プログラム起動時のみ1度だけ使用しています。
681:678
08/04/07 19:54:29
自決
682:デフォルトの名無しさん
08/04/07 20:00:02
以降はチラシの裏に書けよw
683:デフォルトの名無しさん
08/04/07 20:01:52
>>679
コントロールに値を渡した後は元の変数とは何の関係もなくなるから
更新するときは毎回全部設定しなおす必要がある
それと,フィールドをstaticにするのは誰がどう見ても間違い
684:デフォルトの名無しさん
08/04/07 20:04:25
>>665をお願いします...
685:デフォルトの名無しさん
08/04/07 20:32:25
どう見てもC#の質問に見えないからスルーされたんだろ。
686:664
08/04/07 21:00:58
>>683
なるほど。そうでしたか。
試行錯誤の結果、
<変数値変更>
this.Controls.Remove(grid1);
grid1 = new SourceGrid.Grid();
grid1.Refresh();
this.Controls.Add(grid1);
<grid1の表示調整>
<Form1_Load メソッドでgrid1に対して行われるのと同等の処理>
というような流れで、無事初期化・表示更新を行うことができました。
staticについても見直してみます。
貴重なお時間を割いてアドバイスいただき、本当にありがとうございました。
687:デフォルトの名無しさん
08/04/07 21:36:31
>>685
そうでしたか。ごめんなさい。
688:デフォルトの名無しさん
08/04/07 21:44:54
>>678
ノードっつっても色々あるがどのノード?
あとxml["abc"]じゃなくてabcを調べたいんだよな?