質問するログイン新規登録
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

6581閲覧

【c#】インターフェースで実装を隠す

syogakusya

総合スコア67

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2016/10/17 03:34

編集2016/10/17 05:11

0

0

###聞きたいこと
インターフェースを以下のように使うのは邪道ではないですか?

interface IA { void Do } class Testobj { private class A : IA { public void Do() { } public void Do_2() { } } A a; public IA AFuncionality => a; void DoAboutA { a.Do_2(); } } class Test { void TestA() { var obj = new Testobj(); var a = obj.AFuncionality; // ここでaに対してDoしか呼び出せない } }

見えなくていいものを見えないようにしたくて、いままでは名前空間を分けてinternalにしてみたり、見せるためのクラスを作ってインスタンスが要求されるたびにそのクラスのインスタンスを内部で使ってる別クラスのインスタンスから生成したりしてたのですが、やってたらこんなのができたのでこれでもいいのかと気になりました。
よろしくお願いします。

追記:
あんまりポリモーフィズムとは関係のない使い方なので、これでいいのかなぁと。
やりたかったことは、AFuncionalityを使う側はあくまでDoメソッドだけをつかってほしくて、間違ってそれ以外のAのTestobjから呼び出したいパブリックメソッドを呼んだりするとメモリの状態がおかしくなったりするイメージです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

とくに問題ないのではないでしょうか?(どの点を問題にしているのかコードから読み取れませんでした。)

TestAが書きたいように書け、余分なメソッドが見えていないならそれでいいと思います。

そのうえで、呼び出し先の呼び方がわかりやすいかが問題にないります。

具体的なコードでないので、このケースはこれでよいかの判断がつきません。
リファクタリングでこっちのデザインパターンから、こっちのデザインパターンへと切り替えるなどはよくあることなので、わかりやすいコードになっていれば問題ないと思います。

例えば、細かい話ですが、リフレクションを使えば、アクセスレベルの設定を無視することができたりします。つまりアクセスレベルはこのようなことをすると不具合・バージョンアップで動作保証しませんという意図を伝えているのです。

そのような話で、正攻法ではやりずらいクラスがあったらその意図を組んだり、通常ではしないことをいていることを使えたりをコード&コメントでコードの読者に伝えることが大事です。

投稿2016/10/17 04:46

iwamoto_takaaki

総合スコア2884

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

自分の認識と違ったらすいませんが、
ポリモーフィズム的な事でしょうか?
インターフェースに実装されてる関数、プロパティにしかアクセスさせたくない(IntelliSenseに表示させたくない)ということでしたらポリモーフィズムを使用すれば実現出来ると思います
また、邪道でも無いと思われます
http://ufcpp.net/study/csharp/oo_polymorphism.html

csharp

1interface IA 2{ 3 void Do(); 4} 5class A : IA 6{ 7 public void Do() { } 8 public void Do_2() { } 9} 10 11class Program 12{ 13 static void Main(string[] args) 14 { 15 IA a = new A(); 16 a.Do(); //aはinterfaceであるIA型のためDo()のみ表示されDo_2()は表示されない 17 } 18}

投稿2016/10/17 04:44

編集2016/10/17 04:45
MMashiro

総合スコア2380

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問