インターフェースの使い方が間違っている気がします。インターフェイスは、具象クラスが順守しなければならないコントラクトであることを私は知っています。
だから私は私が解決しようとしている問題を説明します、そして多分誰かが私を正しい方向に向けることができます。
リクエストに対してページを返すアプリを作成しています。Cms、Product、Categoryの3つのページタイプがあります。
3つすべてで、次のインターフェイスを実装する必要があります。
public interface IPage
{
PageType PageType { get; set; }
PageContent Content { get; set; }
Meta Meta { get; set; }
}
これらのプロパティは、ページタイプに関係なく再クエリされます。
ページには、タイプに応じて追加のプロパティがある場合があります。たとえば、カテゴリページは次のようになります。
public class CategoryPage : IPage
{
public PageType PageType { get; set; }
public PageContent Content { get; set; }
public Meta Meta { get; set; }
public List<Product> Products { get; set; }
}
現在、要求されたURLのページを返すページサービスがあります。
PageTypeに基づいて、返されるページのタイプを認識します。
問題は、pageServiceがIPageを返すため、任意のページタイプを返すことができることです。
これは、すべてのコンクリートがインターフェイスを実装しているわけではないため、問題です。カテゴリページの場合は、リストもあります。これは、コンクリートタイプにキャストしない限り、アクセスできません。
しかし、ジェネリックページタイプを返し、受信者にそれが具体的であるかを知らせる方法はありますか?
その瞬間が最善の方法ではないということを私がどのように行っているかを確信しており、この小さな問題をどのように解決できるかについて、いくつかの方向性とアドバイスを求めています。
ありがとう
アップデート
私はキャストに落ち着きました。
いくつかのクラスがいくつかの基本プロパティを使用するだけでなく、独自のプロパティを実装する状況を処理するためのより良い方法があるはずです。サービスからこれらのクラスの1つを取得するときは、関連するプロパティを操作できるように、何を取得したかを知る必要があります。
あるいは、私がここでやろうとしていることはまったく間違っているので、別のアプローチを取る必要があるかもしれません。今のところは頑張っていきたいと思いますが、考え続けます。
アップデート2
これを行う方法を変更したので、キャストは必要ありません。操作中のページのタイプを識別するために使用するPageType列挙型があります。
これは、必要なすべてを継承するIpageと相まって、十分に優れたソリューションのようであり、キャストの必要性を排除します。