問題タブ [concreteclass]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - .NET: 構成ファイルを使用して具象クラスを選択する
(この質問は特に C# での質問ですが、一般的には .NET に適用されます)
私は、かなり優れた設計の大きなアプリケーションを持っており、インターフェイス上で主要なセクションに分割されています (これは、並行開発を支援するために行われました)。
これで、必要なインターフェースを実装する具象クラスの基本セットができましたが、別の状況やテスト用の具象クラスの追加セットもあります。
現時点では、これらすべてのクラスをコードの最上位レベルにまとめています。
コンポーネントを交換したい場合は、その行を変更して再コンパイルするだけです。
それはうまく機能しますが、明らかに再コンパイルが必要です.configファイルの値を使用して具象クラスを選択したほうがよいでしょう。
構成ファイルを使用して具体的なクラスを変更するための標準的なパターンは何ですか? この問題を解決するために使用できる標準ライブラリはありますか?
ありがとう!
c# - インターフェイスの内部メンバー
インターフェイスを実装するオブジェクトのリストと、そのインターフェイスのリストがあります。
コンパイラはすべてのインターフェイスメンバーをパブリックにする必要があるため、前のコードはコンパイルされません。
しかし、DLLの外部からのを許可したくないので、をConcreteIAM
介してのみ保存する必要がありMyList
ます。
これを行う方法はありますか?
Update#1:こんにちは、これまでの回答に感謝しますが、どれも私が必要としているものではありません。
インターフェイスはパブリックである必要があります。これは、dllの外部からのクライアントが使用する署名でありID
、他のプロパティとともに、例を単純にするためにわざわざ記述しなかったためです。
IAM
Andrew、解決策は、メンバー+保存を含む別のオブジェクトを作成するためのファクトリを作成することではないと思います。私はまだ考えています...他のアイデアはありますか?
java - 具象クラスはインターフェースを実装します。後でインターフェイスにタイプキャストされます。JVMはTypecastedインスタンスをどのように認識しますか?
インターフェイスに型キャストされた具象クラスですが、JVMはそれを具象クラスのインスタンスと見なしますか?
c# - インターフェイスを返しますが、コンクリートにはインターフェイス上にないプロパティがある可能性があります。キャストで取得できますか?
インターフェースの使い方が間違っている気がします。インターフェイスは、具象クラスが順守しなければならないコントラクトであることを私は知っています。
だから私は私が解決しようとしている問題を説明します、そして多分誰かが私を正しい方向に向けることができます。
リクエストに対してページを返すアプリを作成しています。Cms、Product、Categoryの3つのページタイプがあります。
3つすべてで、次のインターフェイスを実装する必要があります。
これらのプロパティは、ページタイプに関係なく再クエリされます。
ページには、タイプに応じて追加のプロパティがある場合があります。たとえば、カテゴリページは次のようになります。
現在、要求されたURLのページを返すページサービスがあります。
PageTypeに基づいて、返されるページのタイプを認識します。
問題は、pageServiceがIPageを返すため、任意のページタイプを返すことができることです。
これは、すべてのコンクリートがインターフェイスを実装しているわけではないため、問題です。カテゴリページの場合は、リストもあります。これは、コンクリートタイプにキャストしない限り、アクセスできません。
しかし、ジェネリックページタイプを返し、受信者にそれが具体的であるかを知らせる方法はありますか?
その瞬間が最善の方法ではないということを私がどのように行っているかを確信しており、この小さな問題をどのように解決できるかについて、いくつかの方向性とアドバイスを求めています。
ありがとう
アップデート
私はキャストに落ち着きました。
いくつかのクラスがいくつかの基本プロパティを使用するだけでなく、独自のプロパティを実装する状況を処理するためのより良い方法があるはずです。サービスからこれらのクラスの1つを取得するときは、関連するプロパティを操作できるように、何を取得したかを知る必要があります。
あるいは、私がここでやろうとしていることはまったく間違っているので、別のアプローチを取る必要があるかもしれません。今のところは頑張っていきたいと思いますが、考え続けます。
アップデート2
これを行う方法を変更したので、キャストは必要ありません。操作中のページのタイプを識別するために使用するPageType列挙型があります。
これは、必要なすべてを継承するIpageと相まって、十分に優れたソリューションのようであり、キャストの必要性を排除します。
c# - メソッド宣言の戻り値の型は、インターフェイスまたは具体的なクラスにする必要がありますか?
一般的なシナリオでは、多くの場合、インターフェイスまたは抽象クラスが適切な決定ですよね?
しかし、場合によっては、具象クラスの方が優れているように見えます。例えば、
のReplace
メソッドはString
具象クラスを返します。( String はインターフェイスを実装していませんが、これは単なる例です。)
私の質問は
いつインターフェイスを返す必要があり、いつ具象クラスを返す必要がありますか?
program to an interface, not an implementation
インターフェイスを返すための一部ですか?
ruby - 抽象クラス vs 具象クラス?
オブジェクト指向プログラミングを学んでいますが、抽象クラスと具象クラスについて混乱しています。いくつかの実際の例をいただければ幸いです。そして、他のものよりも使用する利点は何ですか? 抽象クラスと具象クラスを好むのはいつですか?
答えが、私が文脈で尋ねている言語に固有のものである場合Ruby
spring - ベスト プラクティス: Spring Autowired、具象クラス、ビルダー
インターフェースがあります:
そしてそれを実装するクラス
ビルダーを使用して EmailNotifyService をインスタンス化していました。
... 等々。しかし今、build() を使用して新しい EmailNotifyService を作成する代わりに、代わりに Spring で Autowire を使用しようとしています。問題は、アプリ内のどこでも、クラスではなく Autowiring インターフェイスであることです。そして、私が読んだことから、それは一般的に良い考えです. 実際、私は NotifyService を Abstract クラスに書き直してから、EmailNotifyService にそれを拡張させてみました。しかし、Spring はそれを正しく Autowiring していません。インターフェイスの場合のように Proxy を作成せず、Autowired フィールドはすべて null です。
そのため、NotifyService インターフェイスの自動配線に行き詰まっているように見えます。罰金。私が理解できないのは、ビルダーで割り当てに使用したデータ (Person、EmailType、および Event) を Spring Autowired インターフェースに取得するにはどうすればよいかということです。
インターフェイス定義を変更して setPerson() や setEmailType() などを持たせることもできると思いますが、それは本当に醜いだけでなく、そもそもインターフェイスを使用する目的を無効にします。別の NotifyService (WebServiceNotifyService または RestNotifyService など) の夜には、その情報は必要ありません。
これを行うためのエレガントでベストプラクティスの方法はありますか?
ありがとう。
編集
私は注釈を使用していますが、xml はほとんどありません。また、トランザクション管理も使用していますが、抽象クラスが適切に自動配線されていない理由を説明できますか? これは私がxmlに持っている唯一の関連情報です:
「オートワイヤーが正しく機能していない」というのは、抽象クラスをオートワイヤーしようとすると、Spring がインターフェイスのように Proxy を作成していないように見え、EmailNotifyService のすべての Autowired フィールド ( PersonRepository、その他 ...) は null です。インターフェイスを使用すると、すべての Autowired フィールドが正しく配線されます。
しかし、私の主な問題は、ビルダーを使用して新しい EmailNotifyService() を直接作成し、それに情報 (Person、EmailType、および Event) を渡すことで、具体的なクラスを明示的に操作していたことです。これらは普通の豆です。EmailNotifyService にはセッター/ゲッターはありませんが、EmailNotifyService 内に存在していた EmailBuilder があります。
しかし今、Person、EmailType、または Event について何も知らない NotifyService インターフェイスを使用しています。しかし、EmailNotifyService が機能するには、この情報が必要です。
私の質問は、Spring を使用して EmailNotifyService を次のように自動配線する場合です。
NotifyService はそれらについて何も知らないので、Person、EmailType、および Event データを設定するにはどうすればよいですか?
現在、Web アプリ内でメーラー サービスを使用していますが、理論的には、メーラー サービスはスタンドアロンで動作できるはずです。いずれにせよ、リクエスト スコープ Bean がここでどのように役立つかはわかりません。
concreteclass - スーパークラスから具体的な実装を見つける
私は大規模なコードベースの一部をリファクタリングしようとしていますが、コードが似ているところにいます -
現在、コードベース全体に List< Animal > を入力として受け取るメソッドがたくさんあるため、これらのインターフェイスを妨害したくありません。これらのメソッドの多くでは、通常、リストが繰り返され、リスト内のすべてのオブジェクトの Animal オブジェクトの「タイプ」属性に応じて、いくつかの処理が行われます。このために、Animal から Cat または Dog への醜いダウンキャストを行う必要があります。例:
何か他に方法がないか考えてみました。何かご意見は?
class - Moqで具象クラスをモックするときにインターフェース引数でコンストラクターを呼び出す方法
コンストラクター注入を使用する次のクラスがあります。
このクラスのほとんどのメソッドでは、 と の Moq モックを作成しIRepository
、IProvider
を構築するだけService
です。ただし、クラスには、同じクラスの他のいくつかのメソッドを呼び出すメソッドが 1 つあります。このメソッドをテストするには、これらすべてのメソッドをまとめてテストするのではなく、メソッドがこれらのメソッドを正しく呼び出し、戻り値を正しく処理することをテストしたいと考えています。
これを行う最善の方法は、モックを作成することService
です。以前に Moq で具象クラスを問題なくモックしました。Moq でコンストラクター引数を必要とする具体的なクラスを問題なくモックしました。ただし、モックされたオブジェクトのコンストラクターにモックされた引数を渡す必要があったのはこれが初めてです。当然、私はこのようにしようとしました:
しかし、それはうまくいきません。代わりに、次のエラーが表示されます。
のコンストラクターがs やs のService
ような単純な引数を取る場合、これは正常に機能しますが、私がモックしているインターフェイスを取る場合は機能しません。これどうやってやるの?int
string