• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:APIをラップしたクラスの設計と開発)

APIをラップしたクラスの設計と開発

sundaraの回答

  • ベストアンサー
  • sundara
  • ベストアンサー率26% (22/82)
回答No.1

Javaだけど、JDBCの実装を参考にしてみたら?あれもドライバ入れ替えでインターフェースはある程度共通だし、近しいんじゃない?

TeferiMage
質問者

お礼

ありがとうございます。 見てみます。

関連するQ&A

  • クラスの設計について

    例えば、システムAPIのパラメータを保持しているクラスは、カプセル化という点でAPIの呼び出しまで行ったほうが良いのでしょうか?(処理を任せる) getParam()などでパラメータを取得する形にしてしまうと戻り値が具体的な型になってしまい、 抽象化しづらくなってしまいます。 もちろんケースバイケースなのかもしれないですが。

  • インターフェースでオブジェクトを取得する意味

    http://yukimura1227.blog.fc2.com/blog-entry-49.html 上記ページにSpringを使用したサンプルプログラムがあり試しに動かしてみたのですが 疑問に思ったことがあるので質問させてください。main()関数の中に SearchGoodsService searchGoodsService = appContext.getBean(SearchGoodsService.class); という記述があり戻り値の型はSearchGoodsService(インターフェース)となっています。 ここをインターフェースではなく実装クラスのSearchGoodsServiceImpl ではダメなのでしょうか。 上記ページの下部の方に 「インターフェースを使うのはSearchGoodsServiceImplにプログラムが依存しないようにするためで、 SearchGoodsServiceImplがどう変わろうが、変更の必要がない」 という趣旨の記述があります。 ここで1つ疑問なのですが 戻り値の型が実装クラスの型であっても SearchGoodsServiceImplがどう変更(メソッドが増えたり、減ったり)しても影響がないと思います。 また、戻り値の型がインターフェースであたとしてもSearchGoodsServiceという インターフェース名の変更があった場合、呼び出し元の 全てのプログラムを修正しなくてはならないと思いますがいかがでしょうか。

    • ベストアンサー
    • Java
  • 派生クラスを含む配列について

    VisualStudio.NETの開発経験があまり無い者です。 WEBサービスを使った開発をするのですが、 対象のメソッドの引数に、特定のクラスの配列を指定するようになっているのですが、 実際にこの引数には、そのクラスの派生クラスのいずれかが入るような感じになっています。 例:ABC(X[]) 引数Xは基底クラスの配列。でもここにはXの派生クラスYやZなどが入る このような場合の実際の指定方法がわかりません。 どのようにしたらよいのでしょうか?

  • VC2010の開発

    VC++(2010)でプログラミングを行っています。 #define A1 (String型) #define A2 (Int32型) #define A3 (Int32型) #define B1 (String型) #define B2 (Double型) #define B3 (Double型) #define C1 (String型) #define C2 (Double型) #define C3 (Double型) 上記のようなA、B、C(型が異なる)をリストで管理したいです。 イメージとしては XX list = {{A1, A2, A3}, {B1, B2, B3},{C1, C2, C3}} です。 テンプレートクラスで実装できますか? また、別な方法があれば教えてください。

  • クラスやメソッドが理解できません

    今javaを勉強中なのですが、クラスやメソッドで生きず待ってしまいました。 メソッドの定義は 戻り値の型 メソッド名(引数リスト) {  文;  ・・・ return 式;  } ですが、メソッドから返されえる値を戻り値といますよね?呼び出し元に値を返すってどういうことなのでしょうか? int getNum() { System.out.println("調べました") return num; } たとえば、上記のようなものですが。もしも、このメソッドを呼び出すと、”戻り値”が戻ってくるわけですが、これはgetNumという変数のなかに計算式が入っている?という考え方でいいのでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • Java
  • 多態性を利用して派生クラスの関数を呼びたい

    環境はVS2013,言語はC++です. 基底クラス側で,基底クラスのポインタを引数に受ける仮想関数を宣言し, 派生クラスでその実装をします. 派生クラス側で引数に派生クラスのポインタを受けて,派生クラスのメンバにアクセスできるようにしたいのです. 作成したサンプルを下記に示します. Hello()は関係ありません. また,これはあくまで簡略化したサンプルなだけなので,thisポインタからメンバにアクセスすればよいというものではありません. #include <iostream> class Base { public: int i; Base() :i(0) {} virtual void print(Base *p) { std::cerr << "Base : " << i << std::endl; } virtual void hello() = 0; }; class Super : public Base { public: int x; Super() : x(1) {} void print(Super *p) { std::cerr << "Super : " << p->x << std::endl; } void hello() { std::cerr << "hello" << std::endl; } }; int main(void) { Base *p; p = new Super; p->print(p); } 上記を実行した結果,Base::print()が呼び出されました. print関数の引数に派生クラスSuperの実態を差すBase型ポインタを与えたときに,Super::print()を呼び出せるようにするには,何か方法はありますか. p->print(p)の呼び出し部分をp->((Super*)p)にキャストしても結果は同じくBase::print()が呼ばれました. Base::print()の実装を無くした場合は,未解決の外部参照のコンパイルエラーが発生し, Base::print()を純粋仮想関数にした場合は,Super側でSuper::pirnt(Base*p)を実装しなければならないのか,抽象クラスのインスタンス化ができないというコンパイルエラーが発生します. これは,派生クラスとはいえ,引数リストの型が違うのでオーバーライドされていないということですよね. 引数をBase *p,Super *pからそれぞれvoid *pへ変更し,Super::print()内で(Super *)へキャストしなおしたところ,きちんとオーバーライドされ,うまくはいきました. しかしながら,この方法だと派生クラス側で実装する際に毎回キャスト処理を書かなくてはなりません. 他に何かきれいな方法はないでしょうか.

  • インターフェイス実装クラスの表示について

    /* インタフェースPlanetを実装したクラスEarth、Marsがあります。  以下の実行結果になるようにクラスAggregateへshowメソッドを  追加してください。 [実行結果] 地球 太陽系にある惑星の1つで、太陽から3番目に近い。・・・ 火星 太陽系の太陽に近い方から4番目の惑星である。・・・ */ // [Planet.java] // 実装したいPlanetクラス interface Planet {   public String getName();   public String getOutline(); } // Planetを実装したEarthクラス // [Earth.java] class Earth implements Planet {   private final String name="地球";   // getNameメソッド:戻り値String、引数無し   public String getName(){    return name;   }   // getOutlineメソッド:戻り値String、引数無し    public String getOutline(){      return "太陽系にある惑星の1つで、太陽から3番目に近い。・・・";    } } // Planetを実装したMarsクラス // [Mars.java] class Mars implements Planet {   private final String name="火星";   // getNameメソッド:戻り値String、引数無し   public String getName(){     return name;   }   // getOutlineメソッド:戻り値String、引数無し   public String getOutline(){     return "太陽系の太陽に近い方から4番目の惑星である。・・・";   } } // メインクラス // [Main.java] class Main{   public static void main(String[] args){   // Earth&Marsクラスのインスタンス化    Earth earth = new Earth();     Mars mars = new Mars();   // Aggregateクラスのインスタンス化   Aggregate aggregation = new Aggregate();   // showメソッド呼び出し:戻り値無し、引数earth・mars    aggregation.show(earth);    aggregation.show(mars); } } // [Aggregate.java] class Aggregate { // ここにshowメソッドを追加   public void show(Earth planet){     System.out.println();   }   public void show(Mars planet){     System.out.println();   }  } showメソッドに引数としてEarth planet,Mars planetを渡すというところまでは理解しています。後は星の名前と概要を表示するのですが、例えば、 showメソッド内 // ここにshowメソッドを追加 public void show(Earth planet){ String str = earth.getName(); System.out.println(str); } public void show(Mars planet){ String str2 = mars.getOutline(); System.out.println(str2); } } とすると、erathとmarsの部分が「シンボルがありません」のエラーになります。自分の認識としては、EarthクラスとMarsクラスでフィールド変数を宣言しているので使えるのでは?と思っていたのですが、全然違うようです。どなたかどちらかのコード例を表記して頂けないでしょうか?よろしくお願い致します。

    • ベストアンサー
    • Java
  • RubyでJavaのInterfaceに相当するものはありますか?

    RubyでJavaのInterfaceに相当するものはありますか? Ruby 上で Javaの interface のようなものものを実現するには、どうしたらよ いのでしょうか? Rubyは型を宣言しないので機能的には interface は不要ですが。 クラスを実装する人に、あるクラスに実装しなければいけないメソッドを伝える (強制する)目的としての interface 的な使い方をしたいのです。 宜しくお願いいたします。

  • 【C#C++】Win32API呼び出し

    C#からWin32APIのようなアンマネージドDLLを呼び出す場合 引数や戻り値にはマーシャリングが必要になりますが C++ではアンマネージドDLLが理解できるような実装に従う限り マーシャリングを行わずに従来通りの方法でアンマネージドDLLを呼び出せると聞きました。 この場合、 1.C#→C++→アンマネージドDLL 2.C#→アンマネージドDLL (※マーシャリングを利用) 1と2ではどちらのほうがパフォーマンス的に有利といえるのでしょうか。 C#からアンマネージドDLLを呼び出すのにC++を間にかませるかどうか 判断に悩んでおります。 よろしくお願いいたします。

  • C++基底クラスに戻り値の異なる関数が宣言されている場合

    こんにちは。 質問させてください。 以下のようなコードがあったとします。 class Base1 { public:   virtual int get()=0; }; class Base2 { public:   virtual float get()=0; }; class Ex : public Base1, public Base2 { public:   int get(){return 0;}   float get(){return 0.0f;} }; void main() { } このプログラムをコンパイルすると 「'Ex::get': オーバーライドする仮想関数の戻り値の型が異なり、'Base1::get' の covariant ではありません。」 というエラーが出てしまいます。 関数の名前と引数が同じで戻り値だけが異なる場合はエラーが出るのはわかるのですが、基底クラスのBase1、Base2は変更不可能だとするとどのように回避すればいいのでしょうか? よろしくお願いします。 /*   WindowsXP Professional SP3   VisualStudio2005 AcademicEdition */