- PR -

Publicメソッドを隠したい

投稿者投稿内容
mso
ぬし
会議室デビュー日: 2003/12/04
投稿数: 496
お住まい・勤務地: 宮城
投稿日時: 2007-06-27 11:40
msoです。

クラスの設計で躓いております。
なんとなく無理そうなのですが、技術的に
可能かどうかを教えていただけ無いでしょうか?

環境:C#(.NetFramework2.0)

コード:


class Class1
{
public virtual void hoge()
{
Console.WriteLine("Hello World");
}
}

class Class2 : Class1
{
//public override void hoge()
//{
// //例外を発生させる
//}
private override void hoge()
{
Console.WriteLine("Hello GoodBye");
}
public void foo()
{
Console.WriteLine("Hello foo");
}
}




上記のコードでClass1を継承したClass2でメソッドhogeを使えないように
したいと考えています。
以前はこのようなケースは強制的に例外を発生させていたのですが、
あまり使い勝手がよくないため何か他の方法は無いかと検討しております。
#class2のhogeは現在、ビルドのタイミングでエラーが発生します。
良い知恵があれば教えてください。

よろしくお願いします。





[ メッセージ編集済み 編集者: mso 編集日時 2007-06-27 11:41 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-06-27 11:47
最近似たような話題がありました。参考になれば幸いです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2007-06-27 12:55
再設計を検討するのが妥当なのでしょうけど、こういうシナリオはなくはないんですよね。

派生クラスでは、例外をスローで良いと思いますよ。コンパイル時に検出できないのが難点ですが、単体テスト時点で分かるのでまぁいいかなと。

.NET Framework Class Library でも、そのような設計になっているクラスがいくつかあったような気がします。具体的にどれかは忘れましたが。

NotSupportedException などをスローすれば、尚良しというところでしょうか。
_________________
囚人のジレンマな日々
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-06-27 13:02
引用:

囚人さんの書き込み (2007-06-27 12:55) より:

派生クラスでは、例外をスローで良いと思いますよ。コンパイル時に検出できないのが難点ですが、単体テスト時点で分かるのでまぁいいかなと。


読み違えているだけかもしれませんが、派生クラスでのお話ならば Obsolete 属性でコンパイル時に解決できるのではないでしょうか。(古い形式扱いを受けるのはイヤというのはありますけど)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
mso
ぬし
会議室デビュー日: 2003/12/04
投稿数: 496
お住まい・勤務地: 宮城
投稿日時: 2007-06-27 14:29
msoです。

最近のやつは・・・・検索しておりませんでした。
申し訳ありません。
検討してみます。

ちなみに当初はObsoleteも検討したのですが、
美しくないので後回しにしていました。
記述しないで申し訳ありません。

[ メッセージ編集済み 編集者: mso 編集日時 2007-06-27 14:30 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-06-27 14:59
引用:

msoさんの書き込み (2007-06-27 14:29) より:

ちなみに当初はObsoleteも検討したのですが、美しくないので後回しにしていました。
記述しないで申し訳ありません。


何をもって "美しくない" と思ったのでしょうか? 例外をスローするのは美しい、もしくは Obsolete 属性よりは美しいと感じたということですよね。その理由をお聞かせ願えないでしょうか? Obsolete 属性は古い形式扱いを受けますが、コンパイル時に解決できるというメリットがあります。例外をスローする方法は実行時でないと検出できません。

個人的には設計が好ましくない以上は何をとっても "美しくない" と思います。そしてそれを根本的に解決するには、設計にメスを入れるしかありません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
mso
ぬし
会議室デビュー日: 2003/12/04
投稿数: 496
お住まい・勤務地: 宮城
投稿日時: 2007-06-27 15:11
msoです。

引用:

じゃんぬねっとさんの書き込み (2007-06-27 14:59) より:
何をもって "美しくない" と思ったのでしょうか? 例外をスローするのは美しい、もしくは Obsolete 属性よりは美しいと感じたということですよね。その理由をお聞かせ願えないでしょうか? Obsolete 属性は古い形式扱いを受けますが、コンパイル時に解決できるというメリットがあります。例外をスローする方法は実行時でないと検出できません。

個人的には設計が好ましくない以上は何をとっても "美しくない" と思います。そしてそれを根本的に解決するには、設計にメスを入れるしかありません。




諸事情で細かいことをすべて説明することは出来ないのですが、
使わないメソッドが存在することが「美しくない」と表現しました。
Obsolete 属性はたしかにビルド時に発見できて便利だと思います。


ちなみに、現在は設計を変更する方向で考えています。


じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-06-27 15:41
引用:

msoさんの書き込み (2007-06-27 15:11) より:

諸事情で細かいことをすべて説明することは出来ないのですが、
使わないメソッドが存在することが「美しくない」と表現しました。
Obsolete 属性はたしかにビルド時に発見できて便利だと思います。


例外をスローするにしてもそれは同じだと思います。

私が伺っていたのは '例外をスローする方法と比べて後回しにしたその理由' です。なぜならば、"美しくないので後回しにしていました" と書かれていたからです。比べて後回しにしたくなる固有のデメリット (美しくない) があるとお考えなのだと思い参考までに伺ったのですが、どうやら無関係のようですね。忘れてください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

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