トップページtech
1001コメント283KB

WPF(XAML, XBAP, .NET4.0)GUIプログラミング Part8

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/12/05(日) 22:08:33
あたらしいユーザーインターフェースシステム、Windows Presentation Frameworkについて語るスレ。
.NET4 もリリースされて盛り上がってまいりますた。

Visual Studio 2010
http://www.microsoft.com/japan/msdn/vstudio/
Microsoft .NET Framework 4 (Web インストーラー)
http://www.microsoft.com/downloads/details.aspx?familyid=9CFB2D51-5FF4-4491-B0E5-B386F32C0992&displaylang=ja
Microsoft .NET Framework 4 (スタンドアロンインストーラー)
http://www.microsoft.com/downloads/details.aspx?familyid=0A391ABD-25C1-4FC0-919F-B21F31AB88B7&displaylang=ja

前スレ
WPF(XAML, XBAP, .NET4.0)GUIプログラミング Part7
http://hibari.2ch.net/test/read.cgi/tech/1282479113/

関連スレ
Microsoft Silverlight その7
http://hibari.2ch.net/test/read.cgi/tech/1288613056/

過去スレ
Part6 http://hibari.2ch.net/test/read.cgi/tech/1274423236/
Part5 http://pc12.2ch.net/test/read.cgi/tech/1261879110/
Part4 http://pc12.2ch.net/test/read.cgi/tech/1245384489/
Part3 http://pc12.2ch.net/test/read.cgi/tech/1231506876/
Part2 http://pc11.2ch.net/test/read.cgi/tech/1211453941/
Part1 http://pc11.2ch.net/test/read.cgi/tech/1162950198/

コードを貼る場合は以下のサイトの利用をお勧め。
run codeのチェックは外しておきましょう。
http://ideone.com/
0573デフォルトの名無しさん2011/01/15(土) 20:04:28
>>571
全体的に API 洗練されてる
コントロール類とほとんど同じノリでベクター画像、3D、動画等混ぜ込める
ビューとモデルの分離しやすい

等々。
05745702011/01/15(土) 21:08:39
xaml処理でpartialが自動生成されるwindow派生クラスの中だと全無視、それ以外だと反応するみたい
フォーラムでg.i.csがどうとか言ってたのが完全にfixされてないのか
0575デフォルトの名無しさん2011/01/16(日) 01:44:29
ExpressionBlendってSilverlightとは仲良いみたいですけど
なんてWPFと仲悪いんですか?
0576デフォルトの名無しさん2011/01/16(日) 01:54:09
どこら辺が仲悪いんですか?
0577デフォルトの名無しさん2011/01/16(日) 02:08:17
俺には仲がいいように見えるけど、あれはマヤカシなのか?
0578デフォルトの名無しさん2011/01/16(日) 02:09:17
>>577
実は仮面夫婦なんですよ
0579デフォルトの名無しさん2011/01/16(日) 03:11:58
>>578
それは、カン・チョクト夫妻な
0580デフォルトの名無しさん2011/01/16(日) 04:11:08
実際、VSよりも数段WPFと仲良いしな
0581デフォルトの名無しさん2011/01/16(日) 10:05:36
でもVSとBlendは仲良くないよ
全く同期されてなくて 片方で編集→もう一方でプロジェクトをリロード を繰り返すことになる
0582デフォルトの名無しさん2011/01/16(日) 10:15:35
両方で同時に開いてる時とか、「読み込みなおしますか?」の警告ある方がありがたいと思うけども。
0583デフォルトの名無しさん2011/01/16(日) 11:00:00
XAMLテキストエディタはVSの方が上だよね
BlendはバインディングやSetterやxmlns:などで全然インテリセンスが効かない
必要ないということなんだろうけど、たまにどうしてもBlendで直接XAML編集したいときにイラっとする
変更がバッティングしたりして面倒だし、どうせ完全にプログラミング寄りで
どう考えても純粋なデザイナーが使うもんじゃないんだからVSに統合でいいよ
0584デフォルトの名無しさん2011/01/17(月) 07:47:37

コマンドでパラメータを渡す時に、複数のエレメントの値をバインドして渡す場合は
どの様にしたらいいんでしょうか?
0585デフォルトの名無しさん2011/01/17(月) 20:18:33
ListBoxとScrollViewer(x:Name="PART_ContentHost")から成るカスタムコントロール(Textboxを継承、WTextBoxとする)を作成しているのですが
煮詰まっています。

わからないのは以下の3点です。
1.ListBoxのItemSourceへのデータバインドの方法(XAMLおよびコード)
以下が例です。(ListBoxに表示するのはNAMEのみ)
 ID/NAME
1 晴れ
 4 曇り
 5 雨

2.WTextBoxに依存関係プロパティ(w)を設定する。
 このとき、 デザイナよりコントロールを配置し、WTextBox.w = 4
を設定した場合、Listbox の ID と一致する項目が選択されているようにするには?

3.ListBoxで選択した項目のIDをWtextBox.w と同期する方法

どなたか親切な方、よかったら教えてください。

 
0586デフォルトの名無しさん2011/01/17(月) 20:55:39
>>584
1.渡したいデータをプロパティとして持つCommandParameter用の型
2.MultiBindingからその型に複数の値をセットするConverter
を作って、それを使ってCommandParameterにBinding。ググれば例は出てくると思う。

>>585
丸投げは関心しない。最低限の基礎を理解してからもう一回出直すことをお薦めする。
0587デフォルトの名無しさん2011/01/17(月) 21:12:01
>>585
そういうコードを書く。コードからコントロールを触るためにTemplatePart付けたんだろ?
OnApplyTemplateの中でFindName("PART_ContentHost")として取得したら
あとはコードから触り放題。イベントハンドラも使いまくる。Generic.xamlには見た目以外のことは一切書かない。
カスタムコントロールはそういうもん。
0588デフォルトの名無しさん2011/01/17(月) 21:34:16
要素をよくいじるようなのは俺ならユーザーコントロールで済ましちゃうなー。
そして大小問わずなんでもユーザーコントロールで部品化してメインのウィンドウにペタペタ貼ってる。

ページっていうのがあるけどこれはWPF/Eで使うイメージ。普通のWPFアプリでは使ってるの見ないな。
0589デフォルトの名無しさん2011/01/17(月) 22:07:53
>>586-588
レスありがとう。

1がわからないから2も3も…だと思っています。

Generic.xamlについて
<ListBox ItemSource = "{Binding}">
みたいにかいて、
コード側で???(´・ω・`)
コード側からListBoxのx:Nameが直に指定できないから
FindNameでみつけてやるべくOnApplyTemplateで書きなさいってことですか><

あー ワカラナイ><
0590デフォルトの名無しさん2011/01/17(月) 22:29:55
結局ComboBoxでしょ?
ComboBoxのテンプレートを作れば十分なはず
0591デフォルトの名無しさん2011/01/19(水) 02:50:41
>>548
IntPtrをZeroにしていない終了じゃね?
0592デフォルトの名無しさん2011/01/19(水) 19:30:13
CheckListBoxをカスタムコントロールで作っているんですけど、
コードでDataContextを設定したいときはどこに書けばいいんですか?
OnApplyTemplateの中に書いても、Loadedに書いてもバインドできたけど、
item.clearしないとだめっぽい。

あと、さらにGeeric.XamlでListBox.ItemContainerStyleのTemplateを書いたら、
止まってしまいました。なぜ???
0593デフォルトの名無しさん2011/01/19(水) 19:32:10
まずカスタムコントロールでDataContext使うのはおかしい
UserControl使う
0594デフォルトの名無しさん2011/01/19(水) 22:21:21
ListView使ってファイラー作ってるんだが、気付くとアイテムを選択するとその後にカラムサイズが変更不可になっちまった
ListView自体にカラム固定機能は元々存在しないし、無理矢理固定する方法もあるらしいが、それによる副作用も見られない
まあ大した不具合でもないけど理屈が判らず気持ち悪い
特別なことと言えばAPICodePackのGlassWindowその他を使っている程度
デバッグをするヒントが判れば嬉しいのですが
0595デフォルトの名無しさん2011/01/20(木) 00:48:58
>>592
どういう状態なのか良く解らんが、
カスタムコントロールよりもListBoxのItemTemplateでCheckBox追加するだけで十分じゃないか?
0596デフォルトの名無しさん2011/01/20(木) 04:18:53
Blendのエディタくらい外注しないで自前でつくってほしいよなぁ
0597デフォルトの名無しさん2011/01/20(木) 23:26:20
GridのDefinitionのWidthやHeightで*を指定したときみたいに、
StackPanelでコントロールを引き延ばす事って可能ですか?
Gridは記述が増えて面倒ですし、DockPanelは一番最後の要素のみみたいなので・・・orz
0598デフォルトの名無しさん2011/01/21(金) 03:43:38
>>597
stackpanelでコントロールを引き伸ばすってどういうこと???stackpanelは子の最
大サイズに合わせて自分を規定するのが原則でサイズ制御の仕組みはないと思うんだ
けど。uniformgridみたいなことをしたいのかすら?
0599デフォルトの名無しさん2011/01/21(金) 08:52:56
.net3.5とBlend3 SDKの
Microsoft.Expression.Interactions.dll
System.Windows.Interactivity.dll
じゃIntellisenseに出てこなかったんですが、
CallMethodActionってBlendを購入しないと使えないんですか?

ChangePropertyAction, GoToStateAction, LaunchUriOrFileAction, RemoveElementAction
は使えるみたいです。
0600デフォルトの名無しさん2011/01/21(金) 08:59:19
Expression Blend を買わなくても、Blend SDK っていうのが無料でダウンロード可能。
0601デフォルトの名無しさん2011/01/21(金) 10:07:25
>>600
Blend SDKは入れてるんですがCallMethodActionだけ使えないんですよね。
SDKをインストールしなおしてもだめで。

Blend3じゃなくてBlend4以降じゃないとダメとかあるのかな。
0602デフォルトの名無しさん2011/01/21(金) 11:43:31
3は知らんが少なくとも4SDKには入ってる
TriggerActionはあるんだったら、継承してリフレクションでメソッド呼び出すだけだから自作しても一瞬だろ
0603デフォルトの名無しさん2011/01/22(土) 08:51:47
依存関係プロパティって
Public Shared 以外で宣言してもいいのですか??
0604デフォルトの名無しさん2011/01/22(土) 10:38:24
なんのために?
0605デフォルトの名無しさん2011/01/22(土) 10:48:05
privateにするのは構わない
インスタンスメンバにするのは重複したりメモリリークしたりするからダメ
0606デフォルトの名無しさん2011/01/22(土) 19:54:27
スレ違いでしたらごめんなさい。
MACでも動作するWebアプリを作りたいのですが、GUIは何で作るのが
おすすめでしょうか?ベテランさんアドバイスをお願いします。
0607デフォルトの名無しさん2011/01/22(土) 19:59:19
スレ違い。
0608デフォルトの名無しさん2011/01/22(土) 20:02:59
WPFアプリケーションプロジェクトにUserControlを追加して、
UserControlにボタンを1個配置して
window1.xamlにclr-namespaceを設定してUserControlタグを配置しただけのコードなんだが
VS2008+C#では動くのに
VS2008+VBでは参照エラー
調査しようと思って家でVS2010+VBを入れてテストしたら普通に動いた
これじゃ会社の環境で開発が進まないんだけど
似たような現象にあった人はいませんか?
0609デフォルトの名無しさん2011/01/22(土) 20:12:06
ViewModel作ってバインドする時、プロバティウインドで弄れるようにするにはどうしたら良いんですか?
いやあ、アレ一回使ってみたいだけなんですが
0610デフォルトの名無しさん2011/01/22(土) 20:13:31
それを見たことはないが、エラー内容を晒さないと誰もアドバイスできないと思う。
もしくはエラー内容で自分でググる。
0611デフォルトの名無しさん2011/01/22(土) 20:20:22
>>609
d:DataContext属性にダミーのViewModelのインスタンスを指定する
Blendならサンプルデータも自動生成してくれるんだけどね
0612デフォルトの名無しさん2011/01/22(土) 23:52:23
デザイナ上で、データセットをドラッグアンドドロップすると次のようなコードが作成されますが
<my:dbDataSet x:Key="DbDataSet" />
<CollectionViewSource ... Source={StaticResource DbDataSet}}"/>
数カ所にあるDbDataSetをDbDataSet1に変えると動作しなくなります
このDbDataSetというKeyの名前は自分で決められるわけではないのでしょうか?
0613デフォルトの名無しさん2011/01/23(日) 03:08:38
>>606
Mac OS みたい見た目にならないが
マルチプラットフォームなRIAならSilverlightでできるよ
0614デフォルトの名無しさん2011/01/23(日) 04:41:39
>>613
Silverlightを使用すると、Win上とMac 上では見た目が異なるということでしょうか?
web開発素人なものですみません。。
0615デフォルトの名無しさん2011/01/23(日) 08:58:26
Mac上で動かしても、Winアプリみたいな外観になるって事では?
(まあ、見た目なんて好きに弄れるけれども)
0616デフォルトの名無しさん2011/01/23(日) 09:12:26
>>615
ありがとうございます。
Mac上でも見た目同じであれば、ありがたいです。
Macがまだないもので、テストできず色々調べているのですが
なかなか思う情報に辿り着かない為困っています。。
0617デフォルトの名無しさん2011/01/23(日) 09:20:06
ここはSilverlightスレと見てる人ほとんど同じだから向こうでやれよ
IISならSilverlightの前に普通にASP.NETじゃダメなのか?
0618デフォルトの名無しさん2011/01/23(日) 09:34:30
>>617
ありがとうございます。
みてる方ほとんど同じだったのですね(^^;;
デザインもプログラマーが作るのであれば
Silverlightの方がいいのかと思いまして。
ビジネスロジックはASP.NETになると思いますが。。
0619デフォルトの名無しさん2011/01/23(日) 20:40:39
InkCanvasをいろいろいじってるんだけど、
塗りつぶしって可能ですか?
お絵かきソフトでよく見るような、インクバケツをひっくり返したアイコンで
閉じた領域を指定した色で塗りつぶしたいのですが。。
もしサンプルとかご存じであれば、教えてください。
0620デフォルトの名無しさん2011/01/23(日) 21:58:25
WPFのShapeとかってベクターグラフィックスだからなぁ。
ビットマップ系のお絵かきソフトとは根本的にやってること違う。
0621デフォルトの名無しさん2011/01/23(日) 22:02:06
自分でPath追加する
0622デフォルトの名無しさん2011/01/26(水) 21:32:04
省略してますがx:Keyを指定しているとして
Resourcesはコレクションなので
1.これはコンパイル出来るのはわかります
<Window.Resources><ブラシ1/><ブラシ2/></Window.Resources>
2.これもコンパイル通ります
<Window.Resources><ResourceDictionary/></Window.Resources>

3.しかし、これがコンパイル通らないのは何故なのですか?エラーメッセージ意味不明
<Window.Resources><ブラシ1/><ResourceDictionary/></Window.Resources>

ResourceDictionary使うなら2の形式を常につかえってことでしょうか
0623デフォルトの名無しさん2011/01/26(水) 21:57:25
1は下の省略形だったと思う
<Window.Resources>
<ResourceDictionary>
<ブラシ1/>
<ブラシ2/>
</ResourceDictionary>
</Window.Resources>

ResourceDictionaryを複数使うときはMergedDictionariesに設定したような気がする
0624デフォルトの名無しさん2011/01/26(水) 22:33:00
>>623
ありがとう、理解出来ました。
MergedDictionariesでどちらもリソースとして含める事ができました

623の指摘で、ResourcesのクラスにContentProperty属性が付いてるのかと思いましたが
違いました。さらに調べるとここに答えがあって
ttp://msdn.microsoft.com/ja-jp/library/ms788723.aspx
Resourcesクラスが実装しているIDictionaryが省略を可能にしてるんですね
0625デフォルトの名無しさん2011/01/29(土) 10:36:23
エロい人いたら教えて下さい。
もしかしてUserControlってバインディングと相性悪い?
0626デフォルトの名無しさん2011/01/29(土) 10:44:44
いいえ
ViewModelにバインドするときはだいたいUserControlにバインドする
アプリケーション固有のビューを作るためのもので、汎用的なコントロールを作る際には使わない
0627デフォルトの名無しさん2011/01/29(土) 11:07:41
UserControlは画面の一部分を切り出したものなので
特定のVMとBindでベッタリくっついた状態で機能する、
CustomControlはVMは外部から任意のものをセットする前提で
VMなしでも単独で機能する、という認識でいいのだろうか。

なんかまわりを見ていると人によってこの境界がマチマチな気がする。
0628デフォルトの名無しさん2011/01/29(土) 11:19:31
ここではMVVMはもう上のレイヤの話なのでひとまず忘れてくれ。
UserControlは振る舞いとビューを分離できない。
カスタムコントロールは振る舞いとビューが分離されていて、必要ならビューを差し替えることができる。
ここでいうビューはMVVMのViewのことじゃなくて、たとえばコントロールの文字列型のプロパティを
TextBlock使って表示するかボタンのキャプションにするかというようなUIの実装の詳細という意味で、
端的にはコントロールテンプレートのこと。振る舞いはコードビハインド。
0629デフォルトの名無しさん2011/01/29(土) 14:43:02
トン。どちらもただのコントロールで提供機能が違うだけなのね。
0630デフォルトの名無しさん2011/01/29(土) 19:21:18
スレ違いかもしれないんですが、
MessageBox的なものを自分で作りたいんですが、
はい/いいえ/再試行/キャンセルなどを言語環境に合わせて変えたい場合どうすればいいですか?
自分で言語設定ファイル置くんじゃなくて、インストールされてる言語パックなんかから取ってきたい。
メッセージボックスで使われている語彙だけでいいんです。
0631デフォルトの名無しさん2011/01/29(土) 21:30:18
そういう機能はOSに無い
0632デフォルトの名無しさん2011/01/29(土) 21:35:42
一旦MessageBox.Showしといてフックでテキスト横取りした上で表示前に殺すとか思いついたが
そもそも実現できるだろうか
0633デフォルトの名無しさん2011/01/29(土) 22:18:37
これでいいんじゃない?
http://ideone.com/yf6La
0634デフォルトの名無しさん2011/02/01(火) 10:56:12
MessageBox.Show ダイアログのボタンの見た目がテーマと異なるもんだから、「Windows Aero を適用しているのにクラシックなボタン」という中途半端なのをどうにかしてほしいのだが、
マイクロソフトはいつになったらそういう細かい部分を改修してくれるんだろう。
機能的には不備はないんだけれど見た目がね。人は見た目が9割。
0635デフォルトの名無しさん2011/02/01(火) 13:17:14
お前が無知なだけ
0636デフォルトの名無しさん2011/02/01(火) 13:17:57
ちょっと調べりゃ解決できるこったろうに
0637デフォルトの名無しさん2011/02/01(火) 16:46:50
説明が下手でMVVMもろくに理解出来てないのですが、
例えばあるネットワークアプリにおいて、コアの機能(例えば通信等)を別のライブラリに置くとすると、
モデルとなるものは、ライブラリの中に書くと思いますが、
この場合はINotifyPropertyChangedやコレクションはObservableCollection(or INotifyCollectionChanged)を予め使い、モデルを実装した方が
GUIとの連携の際楽かと思いますが、この実装は正しいでしょうか?
(予め実装するのはなんとなく気持ち悪い気はしますが・・・)
またその場合に、対応するVisualModelを作成せず、直接MainWindow等のViewModelへモデルのインスタンスを置くのは
微妙な実装ですかね?

あとライブラリが自分の作った物では無い場合は、ラッパークラス(対応するVisualModel)を作ったりするのでしょうか?
変更通知イベント等を捕まえるのかな・・・
0638デフォルトの名無しさん2011/02/01(火) 19:57:50
>>518の公式ドキュメントによると、
モデルがINotifyPropertyChangedやINotifyCollectionChangedを実装している場合は
わざわざViewModelでプロパティを全部ラップしなくてもそのまま公開してViewとバインドしても構わない
0639デフォルトの名無しさん2011/02/02(水) 01:02:48
>>638
レスありがとうございます
なるほど、>>518のドキュメントってそういう事等が書いてあるんですね・・・と思ったけど英語・・・orz
時間あるときにでも頑張って呼んでみたいと思います!
0640デフォルトの名無しさん2011/02/02(水) 05:13:15
>>637
ネットワークをコア機能と考えてる時点でもうmvvmとは離れてるんジャマイカ?

prismはべつにmvvmのフレームワークでもなんでもなくて、コンパウンド・アプリケーションのフレームワークが最近は
mvvmもサポートしてますよ〜ってだけだから、それを参考にしてmvvmのベスト
プラクティスでございますっていうのは、よく考えたほうがいいぞ。
0641デフォルトの名無しさん2011/02/02(水) 20:02:19
質問です

コンボボックスを継承したカスタムコントロールを作ったんですけど、
デザイナでそのコントロールを置くと、中のアイテムが表示されません。
デザイナでもアイテムが表示されるようにするにはどうすればいいんですか?


0642デフォルトの名無しさん2011/02/04(金) 02:00:47
そもそも継承するという発想自体がアウト。

テンプレートやビヘイビアで改造するのが流儀なんですが・・・
0643デフォルトの名無しさん2011/02/04(金) 07:13:19
>>642
継承元のコンボボックスもカスタムコントロールなんです。
0644デフォルトの名無しさん2011/02/04(金) 07:33:47
ユーザコントロールは、元の機能にない機能を追加してる場合に使う
もしその継承元のコンボボックスが見た目程度しか変更してないのであれば
そんなコントロールを使うのはやめて
WPFのコンボボックスの見た目をテンプレートで変えるコードに書き直せばいい
時間が許せば。
0645デフォルトの名無しさん2011/02/04(金) 13:39:42
時間「絶対に許さない」
0646デフォルトの名無しさん2011/02/04(金) 20:48:11
万一、コントロールのバグが発覚した時の対策なんかに
取り敢えず継承だけして、機能を一切追加せずに使うとかは?
0647デフォルトの名無しさん2011/02/04(金) 20:50:55
意味なし
最近は.NETでもJavaでも他のでも「継承は悪」が基本
0648デフォルトの名無しさん2011/02/04(金) 21:24:59
寝言はWPFの継承ツリーを見直してから言え
0649デフォルトの名無しさん2011/02/04(金) 21:36:03
インターフェース主流なのは解るが
全派生先で同じ実装するくらいなら、素直に継承すべき
0650デフォルトの名無しさん2011/02/05(土) 10:15:48
最近のWPFでの機能追加は、継承よりもビヘイビアが主流なんですがね。
0651デフォルトの名無しさん2011/02/05(土) 10:17:59
アプリケーションレベルではな
クラスライブラリとしてコントロールを提供する場合はそんなもん使わない
0652デフォルトの名無しさん2011/02/05(土) 10:32:41
結局好きなように作ればいいの?
0653デフォルトの名無しさん2011/02/05(土) 10:36:45
仕事でなければそんなん当たり前
0654デフォルトの名無しさん2011/02/05(土) 10:39:30
>継承は悪
これは多重継承できちゃう言語が戦犯なだけじゃないの?
0655デフォルトの名無しさん2011/02/05(土) 10:44:22
継承元の仕様が変わったらどうすんの?って話
仕様変わるならsealしとけカスって思うけどね
0656デフォルトの名無しさん2011/02/05(土) 11:03:39
DependencyObject継承するのが大前提のビヘイビアを例に出すのは可笑しい
0657デフォルトの名無しさん2011/02/05(土) 11:14:37
AがBを継承していて、CがBを使っているとすると、CはAとBの両方に依存することになるけど、
BがAを継承せずに内部で使っているだけなら、CはBにしか依存しないわけだ
だからAの仕様が変わってもBだけ変更すれば済む
0658デフォルトの名無しさん2011/02/05(土) 11:21:50
でもBをAとして扱うのが要件だったらアウトだね
0659デフォルトの名無しさん2011/02/05(土) 11:25:57
それは要件定義した奴に責任が行くから問題ないさ
0660デフォルトの名無しさん2011/02/05(土) 11:31:13
ControlにFooする機能を追加したFooControlと
Barする機能を追加したBarControlがあったとして
FooとBar両方が欲しくなったらどうするのか? という問題もあるな
0661デフォルトの名無しさん2011/02/05(土) 11:35:07
AbstractFooBarControlじゃないすか
0662デフォルトの名無しさん2011/02/05(土) 11:35:12
>>660
まーやり方はいろいろあるけど
FooControlもしくはBarControlのどちらかを継承したクラス(HogeControlを作って
継承しなかった方はHogeControlのコンストラクタでインスタンスを作って
アクセス用のメソッドを作るとか

HogeControlを外から見れば両方継承してるように見ればいいだけだし
0663デフォルトの名無しさん2011/02/05(土) 12:15:07
>>654
継承は悪、の根拠は結合密度の問題。
 is-a = 元クラスはホワイトボックス。元クラスの実装を変えたら影響を受ける。
 has-a = 所持クラスはブラックボックス。所持クラスの実装を変えても仕様が変わらなければおk

継承を使ってもちゃんと設計しハリウッドの原則に従えば疎結合にはできるし必ずしも悪ではないが、
protected変数を書き換え元クラスを制御ようなアホがいる限り"継承は悪"を言い広めるのが世のため人のため
0664デフォルトの名無しさん2011/02/05(土) 12:21:02
>>647は.NET一般の話なのに、>>650がビヘイビアの話にすり替えているのがおかしい

>>663
protected変数の書き換えが出来る時点でフレームワークがダメダメ
リフレクション前提ならそれもバカな話だ
0665デフォルトの名無しさん2011/02/05(土) 12:27:42
昔の思想やJavaの言語仕様に問題があっただけで、.NETじゃ継承もブラックボックスだよね
基本的に継承しても意味のないつくりになっていて、継承するのは継承専用に設計されたクラスだけ
0666デフォルトの名無しさん2011/02/05(土) 12:38:54
ヘルスバーグさまさまってとこか
0667デフォルトの名無しさん2011/02/05(土) 12:48:33
> protected変数を書き換え
というか派生クラスに書き換えてもらうためにprotectedにしてるんじゃないのか
0668デフォルトの名無しさん2011/02/05(土) 12:49:48
C#や.NETは基底クラスの変更によって派生クラスが誤動作しないように
やたらと細かい仕様があるからな
いかに基底クラスの変更を危険視してるかがわかる
約束事が通じる範囲なら勝手だけど、不特定多数向けのクラスライブラリ向けなら
protectedフィールドはpublicフィールドと何も違わない
0669デフォルトの名無しさん2011/02/05(土) 16:27:22
>664

つーか、ここWPFのスレなんだけど。
一般論展開したいなら余所のスレに行けばいい。

0670デフォルトの名無しさん2011/02/05(土) 16:30:01
>656
継承前提で使うクラスと、コントロールの継承とでは意味が違うんですが。
0671デフォルトの名無しさん2011/02/05(土) 16:33:09
>>669-670
両方とも俺じゃなくて>>647に言えよ
0672デフォルトの名無しさん2011/02/05(土) 16:35:24
実装の多重継承を許可しない設計の言語では、
継承によって小単位でカプセル化された特性やポリシーを
いくつも組み合わせて提供することができないから
「継承は悪」と思ってきたけど、そうじゃないの?
0673デフォルトの名無しさん2011/02/05(土) 18:30:07
>>663
>>ハリウッドの原則
もしよければ参考になる記事をおしえてくださ〜い。

>protected変数を書き換え元クラスを制御ようなアホがいる限り
継承したクラスが親クラスのprotectedで定義されている変数を直接いじるって解釈でOK?
■ このスレッドは過去ログ倉庫に格納されています