У меня такое ощущение, что я неправильно использую интерфейс.Я знаю, что интерфейс - это контракт, которому должен соответствовать конкретный класс.
Поэтому я объясню проблему, которую пытаюсь решить, и, возможно, кто-то может указать мне правильное направление.
Я создаю приложение, которое возвращает страницу для любого запроса, у меня есть три типа страниц, Cms, Product и Category.
Все три должны реализовать следующий интерфейс:
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, чтобы он могвернуть любой из типов страниц.
Это проблема, поскольку не все мои бетоны просто реализуют интерфейс, в случае страницы категории он также имеет список, который каквы ожидаете, что я не смогу получить доступ, если я не приведу к конкретному типу.
Но есть ли способ, которым я могу вернуть универсальный тип страницы и дать получателю знать, что это за конкретный тип?Я уверен, что, как я делаю это, что момент не самый лучший способ и хотел бы некоторые указания и советы о том, как я могу решить эту маленькую проблему.
Спасибо
Обновление
Я согласился на приведение.
Я уверен, что должен быть лучший способ справиться с ситуацией, когда несколько классов используют некоторые базовые свойства, но также реализуют свои собственные.когда вы получаете один из этих классов из службы, вам нужно знать, что вы получили обратно, чтобы вы могли работать с соответствующими свойствами ..
Или, может быть, то, что я пытаюсь сделать здесь, просто неправильно, и янужно принять другой подход.Я думаю, что буду настаивать на том, что у меня есть сейчас, но продолжаю думать об этом.
Обновление 2
Я изменил способ, которым я делаю это, поэтому у меня нет необходимости в приведении, у меня есть перечисление PageType, которое я использую для определения типастраницы, с которой ведется работа.
Это в сочетании с Ipage, который наследует все необходимое, кажется достаточно хорошим решением и устраняет необходимость в приведении.