質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

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

インターフェース

インターフェイスという用語はハードウェア・ソフトウェアの両方に使うことができます。 一般的に、インターフェイスは内部処理の詳細を見せないように設定されます。オブジェクト指向プログラミングにおいて、インターフェイスはabstractクラスとして定義されます。

Q&A

解決済

2回答

7465閲覧

インターフェースの実装について

f_horizon

総合スコア163

C#

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

インターフェース

インターフェイスという用語はハードウェア・ソフトウェアの両方に使うことができます。 一般的に、インターフェイスは内部処理の詳細を見せないように設定されます。オブジェクト指向プログラミングにおいて、インターフェイスはabstractクラスとして定義されます。

1グッド

0クリップ

投稿2015/09/18 23:53

C#でインターフェースの実装を考えているのですが、手詰まりになってしまったので質問させていただきます。
VisualStudioにAプロジェクトとBプロジェクトを作成し、AプロジェクトではITestableインターフェースを定義しています。
BプロジェクトではAを参照設定に追加し、ITestableインターフェースをオーバーライドしています。
そこで、以下のようにAプロジェクト内のTestクラスで、Bプロジェクトで実装されたインターフェースを使うことはできるのでしょうか。

Aプロジェクト public interface ITestable { bool Test(); } class Test { //実装されたTest()を使いたい… //汎用性を高めるため、BプロジェクトのBクラスをnewする等はしたくない… }
Bプロジェクト using A; public class B : ITestable { public bool Test() { return true; } }

今まであまりインターフェースを使っていなかったので、そもそも使い方の理解がなっていないかもしれませんが、ご教授お願い致します。

sheephuman👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

せっかくインターフェースを使っているのですから、
Aプロジェクト側では引数の型に、「ITestableの実装クラス」ではなく、ITestableを指定します。
(というか、どういう実装をされているかを気にしないためにインターフェースを使うもの)

例えば

C#

1//Aプロジェクト 2public class Foo 3{ 4 //... 5 public void SomeMethod(ITestable testable) 6 { 7 //... 8 var b = testable.Test(); 9 //... 10 } 11}

B側(もしくはA,Bを知っている他のプロジェクト側)では

C#

1//Bプロジェクト 2class Bar 3{ 4 void Hoge 5 { 6 ITestable t = new B(); 7 Foo f = new Foo(); 8 f.SomeMethod(t); 9 } 10}

投稿2015/09/19 01:12

編集2015/09/19 01:28
ozwk

総合スコア13512

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

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

f_horizon

2015/09/24 23:56

ご回答ありがとうございます。 参考にさせていただきながら、利用側が実装クラスもnewしたくない(できない)といったことをプロパティも利用して解決することができました。 まだまだ使いこなせていなかったですが、また一つ勉強になりました。 ありがとうございました。
guest

0

こんにちは。

AプロジェクトとBプロジェクトで循環参照が起きているので
ビルドモジュールのバージョン違いなどによる不正な動作を行う可能性がありますので
循環参照は避けたほうが良いでしょう。

あとはozwkさんが仰っているとおり、実装を意識しなくて済むのがインターフェイスのメリットですので
実装クラスではなくInterface型としてインスタンスを扱ってみましょう。

Interface実装時に循環参照が発生する場合は私の経験上は往々にしてクラス設計が不十分です。
無理にプロジェクトを分けないほうが良いこともあります。
どちらにせよ構成から再検討してみてください。

投稿2015/09/19 02:04

Tak1wa

総合スコア4791

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

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

f_horizon

2015/09/25 00:02

ご回答ありがとうございます。 循環参照にしないためにクラスのオブジェクトが生成できない。。。といったことが問題だったのですが、上にありますように無事に解決できました。 インターフェースを絡めたプロジェクトのクラス設計…勉強になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問