- PR -

継承元のパブリックメソッドを外部に隠ぺいしたい

投稿者投稿内容
jornada690
常連さん
会議室デビュー日: 2006/06/13
投稿数: 25
投稿日時: 2007-06-20 16:27
よろしくお願いします。

文章だけでわかりにくいかもしれませんが、
クラス(A)にパブリックなメソッドAAがあり、クラス(A)のインスタンスからはメソッド(AA)を呼び出せるようにしたいが、クラス(A)を継承するクラス(B)のインスタンスからはメソッド(AA)を隠ぺいする(参照できなくする)方法はあるのでしょうか?

クラスBでnewキーワード(C#)かOverrideキーワードによって空のメソッドAAを定義して、メソッドそのものを無効にするしか方法はないのでしょうか?

KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-06-20 16:51
(1) 外から見えないようにしたい(呼び出すとコンパイルエラーになる)
(2) 呼ばれても何も起こらないようにしたい

の、どっちですか?
普通、隠蔽という言葉は (1) の意味なのですが

引用:

クラスBでnewキーワード(C#)かOverrideキーワードによって空のメソッドAAを定義して、メソッドそのものを無効にするしか方法はないのでしょうか?



このあたりを読む限りでは、実は (2) の意なんじゃないかと思いました。
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2007-06-20 16:52
#回答ではありません

Aを継承したBは、「Aである」と同義です。
なので、外へ公開しているのに自分で自身のメソッドを見れないということになり矛盾してませんか?

BがAを継承しているということはAを知っている、つまりAを意識しているということです。
知っているなら「呼ばなければよい」ということになりませんか?
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2007-06-20 16:55
混乱。。。

・Bの実装内部で呼べなくする
・Bの利用者が呼べない

のどっちでしょう?

#クラス(B)のインスタンス「からは」という言葉から先の投稿となりました。
jornada690
常連さん
会議室デビュー日: 2006/06/13
投稿数: 25
投稿日時: 2007-06-20 17:02
回答ありがとうございます。
---------------------------
KIさん
 私の希望する処理は(1)です。
 IntelliSenseにリストされてこないようにしたいです。

---------------------------
まどかさん
 おっしゃる通りですが、数多くあるメソッドのうち一部のメソッドをそうしたいのであり、かつ、クラスAのインスタンスも存在しておりそのインスタンスからは当然のごとく全てのメソッドを呼び出す必要がある場合です。
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2007-06-20 17:14
引用:

まどかさん
 おっしゃる通りですが、



いえいえ、「外から見えなくする」という意味では私の先の投稿は無視してください。

C#はVBのShadowsとピッタンコのってないのかな?
全派生先ならSealedでOK?
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2007-06-20 17:32
jornada690さんは隠ぺいという言葉を使ってらっしゃいますが、.NETの世界では隠蔽という概念があります。
コード:
class Base
{
	public virtual void F() { Console.WriteLine("Base.F"); }
	public virtual void G() { Console.WriteLine("Base.G"); }
}

class Derived : Base
{
	public override void F() { Console.WriteLine("Derived.F"); }
	public new void G() { Console.WriteLine("Derived.G"); }
}


こういうクラスがあったとします。F()はDerived内でオーバーライドされています。G()は隠蔽されています。
コード:
Derived d = new Derived();
Base b = d;

b.F();
b.G();
d.F();
d.G();


このように呼び出した場合、結果は
Derived.F
Base.G
Derived.F
Derived.G
となります。
jornada690さんが求めているのはこの隠蔽(つまりメソッドGの動き)じゃないですよね。

クラス(A)のメソッド(AA)は呼べるわけですが、上の例のようにクラス(B)のインスタンスをクラス(A)として参照している場合はどうなると考えていらっしゃいますか?

単にインテリセンスに出なければ呼び出せてもいいということでしょうか。
ガルマ・ザビ
ベテラン
会議室デビュー日: 2007/06/07
投稿数: 55
お住まい・勤務地: ジオン公国
投稿日時: 2007-06-20 17:41
はじめまして。

引用:

KIさん
 私の希望する処理は(1)です。
 IntelliSenseにリストされてこないようにしたいです。



これを満たすには、メソッドをOverrideして、
EditorBrowsableAttribute(インテリセンスに出さないようにする)を設定するのが
いいのではないでしょうか?

スキルアップ/キャリアアップ(JOB@IT)