継承がよくわかりません。DBGRID

解決


勉強始めました。  2009-06-28 00:00:20  No: 34930

基本的な質問で申し訳ありませんが、DBGridを使って選択行の色表示を変える
ためのソースは見つけたのですが、

TExDBGrid = class(TDBGrid);

でTDBGridを継承したTExDBGridのプロパティでRowを使ってカレント行を獲得
していました。

TDBGridでは、Row が参照できないのに
TDBGridから継承されたTExGridには、Rowを参照できるのは何故でしょうか?

宜しくお願いします。


ぽむぽむ  2009-06-28 07:29:23  No: 34931

なんとなくですが・・・

フォームに貼り付けたDBGrid に対して
DBGrid1.Row と書くとコンパイルエラー。
でも、継承したTExGrid は、継承したクラス内から参照している
例えば、override した procedure DrawCell 内からRow を参照している。

これは、protected は、継承したクラス内からは見えますが、
利用する側からは見えないというスコープの違い。

ただし、同一ユニット内のクラス同士であれば、protectedでも見えます。

「delphi スコープ」で検索したら、もっといい解説ページみつかるかな?


勉強始めました。  2009-06-30 01:18:13  No: 34932

ぽむぽむ様、回答ありがとうございます。

参考にしたソースは、
http://delfusa.main.jp/delfusafloor/archive/www.nifty.ne.jp_forum_fdelphi/samples/00130.html
なのですが、

If TExDBGrid(Sender).Row = GCoord.Y Then

DBGridでは、下記、
>これは、protected は、継承したクラス内からは見えますが、
>利用する側からは見えないというスコープの違い。

の理由で参照できないと思いますが、TExDBGridの場合に参照できる点が??です。

また、
https://www.petitmonte.com/bbs/answers?question_id=5267
では、コンポーネントを作成したら、Row がプロパティとして利用できました。
オブジェクトインスペクタにものっていました。
DBGridの継承のはずなのに??

質問がわかり難いとは思いますが宜しくお願いします。


そういわれても  2009-06-30 01:41:55  No: 34933

>protected は、継承したクラス内からは見えます

これがすべてだよ。
これ以上説明のしようがないと思うけど。


ttt  2009-06-30 03:35:24  No: 34934

質問者さんが疑問に思っているのは、
実際の継承クラスであるTExDBGridとは全然関係ないメソッドの中から

procedure TForm1.DBGrid1DrawColumnCell(...)
...
  If TExDBGrid(Sender).Row = GCoord.Y Then
...

みたいに勝手にキャストしただけでなんでprotectedのメンバにアクセスできるのか、ということでしょう。
(ちなみにこのSenderは本当のTExDBGridではなく、
あくまでも基底クラスであるTDBGridのインスタンスです。)
確かに通常のオブジェクト指向の常識だとこれは理解できません。

実はDelphiの場合、「クラスが宣言されているunit内」であれば
誰でもそのクラスのprotectedメンバを参照できます。(C++でいうfriendのようなもの)
これを逆手にとって、ダミーの継承クラスを宣言してやることで
元のクラスのprotectedメンバにアクセスしてしまうことが可能です。

このテクニックは旧Delphi FAQでも(ちょっとだけですが)紹介されています。
http://support.codegear.com/article/37436 の「StringGrid で入力文字数の制限を行なう方法」


勉強始めました。  2009-06-30 18:35:14  No: 34935

回答ありがとうございます。

tttさんのおっしゃるとおり、
>勝手にキャストしただけでなんでprotectedのメンバにアクセスできるのか
が分からなかったのですが

キャストしただけでも、、「クラスが宣言されているunit内」で
元のクラスのprotectedメンバにアクセス可能になった訳ですね。

ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加