C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: クラスの継承で基底クラスのメンバ名を変えたい


(過去ログ 108 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■64385 / inTopicNo.1)  クラスの継承で基底クラスのメンバ名を変えたい
  
□投稿者/ ペリー (1回)-(2012/11/30(Fri) 11:46:35)

分類:[VB.NET/VB2005 以降] 

ClassAを継承したClassBを作ろうと思います。
ClassAにはプロパティのメンバとして、P1, P2, P3があるとします。
ここで質問ですが、基底クラスClassAのメンバP3をClassBでは別名で定義したい
(実体はP3だが定義名は例えばP4とする)、
あるいはClassAのメンバP3をClassBではPrivateとしてアクセスできないようにしたい
(代わりにP4という名前で基底クラスのP3にアクセスする)のですが、
そのようなことは可能なのでしょうか?
(それとも、そもそもこのような考えはオブジェクト指向のセオリーに反しているのでしょうか?)

VBは2008〜2010を使用しています。
よろしくお願いします。
引用返信 編集キー/
■64387 / inTopicNo.2)  Re[1]: クラスの継承で基底クラスのメンバ名を変えたい
□投稿者/ まり (9回)-(2012/11/30(Fri) 12:11:21)
キーワードOverridesとかShadowsとかで調べてみたらどうでしょうか?

http://homepage1.nifty.com/rucio/main/VBdotNet/Advance/Advance2.htm
中学生でこのレベルって高いと思うのですが^^;私が低いのか
引用返信 編集キー/
■64389 / inTopicNo.3)  Re[2]: クラスの継承で基底クラスのメンバ名を変えたい
□投稿者/ 774RR (24回)-(2012/11/30(Fri) 12:42:29)
> それとも、そもそもこのような考えはオブジェクト指向のセオリーに反しているのでしょうか?
LSP とかには違反している、んだろうな。
そういう実装をした結果として、
「派生クラスの挙動」が、「基底クラスを使う」側の期待(=契約)を裏切らない、
ようにすることが可能であればセオリー違反ではない(そんな実装が可能かどうかは判断つかないけど)

その辺文章だけでは判断できないけど、俺ならそういう設計はまずやらない。
引用返信 編集キー/
■64396 / inTopicNo.4)  Re[1]: クラスの継承で基底クラスのメンバ名を変えたい
□投稿者/ shu (107回)-(2012/11/30(Fri) 14:36:35)
No64385 (ペリー さん) に返信

目的を明確に示されるともっと良い案がもらえるかもしれません。

提示されたような実装ができたとしても
ClassBのインスタンスbはClassAにキャストすることによりClassBで
Privateなメンバーにアクセス出来ることになってしまいます。
引用返信 編集キー/
■64398 / inTopicNo.5)  Re[2]: クラスの継承で基底クラスのメンバ名を変えたい
□投稿者/ howling (113回)-(2012/11/30(Fri) 15:37:45)
まりさん

overrideは知って使っていましたが、
shadowsは初めて知りました!
多分継承して、中身を空で書くとかいう酷いことをするって話になる気がしますが…。
まぁ、元より設計からしておかしいですしね…。

No64385 (ペリー さん) に返信

基底クラスと似ていることをやっているけど、ちょっとだけ違うんだよね、とかいう話は、
基底クラスの設計ミスか、今から作る継承側を基底クラスのやり方に合わせるのが正しいのかなと。
いずれにしても設計を変えた方がいいんじゃないでしょうか?っていうのはとりあえずここまでにしといて。

ただ単にアクセスを変えるだけなら、
set/getプロパティを自分で別途作って、setで基底のプロパティの書き換えを行い、
getで基底のプロパティの取得をするように作れば良いかと。

ただ、クラス内部で基底クラスのプロパティに触れているというのはどうしようもないです。
自分が使う時にはその自作プロパティを使うっていうルールをただ設けるだけで、
基底に触れたからエラーみたいなことはまた別のやり方かなと。


引用返信 編集キー/
■64401 / inTopicNo.6)  Re[1]: クラスの継承で基底クラスのメンバ名を変えたい
□投稿者/ shu (110回)-(2012/11/30(Fri) 15:54:00)
No64385 (ペリー さん) に返信

継承ではなくラッピングをするとか。
Public Class A
    Public P1 As Integer
End Class

Public Class B
    Private AInst as New A
    Public Property P2 As Integer
        Get
            Return AInst.P1
        End Get
        Set(value As Integer)
            AInst.P1 = value
        End Set
    End Property
End Class

Publicで残したいものすべて定義しなおしですが、提示された内容を
実装するには確実な方法になるかと思います。

引用返信 編集キー/
■64421 / inTopicNo.7)  Re[2]: クラスの継承で基底クラスのメンバ名を変えたい
□投稿者/ επιστημη (29回)-(2012/11/30(Fri) 22:11:31)
επιστημη さんの Web サイト
> あるいはClassAのメンバP3をClassBではPrivateとしてアクセスできないようにしたい

であるなら、そもそも
- ClassA が メンバP3 を(publicに)持つこと
あるいは
- ClassA から ClassB を導出すること
のどちらかがマチガイかと。

引用返信 編集キー/
■64426 / inTopicNo.8)  Re[3]: クラスの継承で基底クラスのメンバ名を変えたい
□投稿者/ かたぎり (4回)-(2012/12/01(Sat) 01:31:55)
2012/12/01(Sat) 01:32:43 編集(投稿者)

クラスの設計というか、継承の仕方というか、そんなのが違うような気が。

目的として、

ClassAはP1,P2,P3
ClassBはP1,P2,P4
をもちたい。

P3とP4はフィールドが同じものをSetterGetterさせたい。

だと思ったので、そうなのであれば、

基底クラスClassCを作成して
P1,P2,P3とP4の元となる?フィールドをF1としてprotectedでもっておけば

ClassAはClassCを継承して、P3(F1)を作成
ClassBはClassCを継承して、P4(F1)を作成

ですっきりするのではないかなぁ、と思ってみたりしましたです。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -