インタフェースの使用が間違っていると感じました。私はインターフェイスがコンクリートクラスが遵守しなければならない契約であることを知っています。インターフェイスを返すが、コンクリートにはインターフェイスにないプロパティがある可能性があります。キャストでそれらを取得できますか?
私は解決しようとしている問題について説明し、誰かが私を正しい方向に向けることができます。
リクエストに応じてページを返すアプリケーションを作成しています.Cms、Product、Categoryという3つのページタイプがあります。これらのプロパティは、どのようなページ・タイプを再クエリしている
public interface IPage
{
PageType PageType { get; set; }
PageContent Content { get; set; }
Meta Meta { get; set; }
}
:
すべての3つは、次のインタフェースを実装する必要があります。私は要求されたURLのページを返しますページサービスを持っている現時点で
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; }
}
:
ページは、カテゴリページはそうのような可能性があり、たとえば、その種類に応じて、余分な性質を有することができます。
PageTypeに基づいて、どのページタイプを返すかを知っています。
問題は、pageServiceが任意のページタイプを返すことができるようにIPageを返すことです。
これは、すべてのコンクリートがインターフェイスを実装しているわけではないので、カテゴリページの場合は、リストがあります。具体的なタイプにキャストしない限りアクセスできません。
しかし、私は一般的なページタイプを返すことができ、受信機にそれが具体的であることを知らせる方法はありますか?
私はこの瞬間が最善の方法ではなく、この小さな問題をどのように解決できるかについていくつかの方向性や助言をしたいと思います。
おかげ
更新
私は、キャストのために定住しています。
いくつかのクラスがいくつかの基本プロパティを使用しているが、独自のプロパティを実装している状況を処理するには、より良い方法が必要であると確信しています。サービスからこれらのクラスの1つを取得するときには、取得したものを知って、関連するプロパティで作業できるようにする必要があります。
多分私はここでやろうとしています。別のアプローチをとる。私は今私が持っていることを続けていくつもりだと思っています。私はこれをやっている私は道を変えた2
アップデートので、私は、キャストを必要としない、私は私が働いているページの種類を識別するために使用するページタイプの列挙型を持っています。
これは、必要なものすべてを継承するIpageと組み合わせると、十分な解決策であると思われ、キャストの必要がなくなります。
私はインターフェイスの一部ではないプロパティの値を取得するためにキャストします。私はif(page.GetType == typeof(CategoryPage))を使用することを検討していた - しかし、私は本当にしたくない、私はデザインが間違っていることに同意する、質問の情報に基づいて、設計? –