Я новичок в интерфейсах и абстрактных классах. Я хочу создать пару интерфейсов для определения основных методов и переменных для объектов для системы корзины покупок. Затем я хочу создать абстрактные классы, которые реализуют основные функции. Идея состоит в том, что они могут использоваться другими классами немного по-разному для разных проектов.
Вот мои (урезанные) интерфейсы:
public interface ICart
{
...
List<ICartItem> CartItems { get; set; }
}
public interface ICartItem
{
int ProductId { get; set; }
int Quantity { get; set; }
}
А вот мой абстрактный класс Cart (опять же, показывающий только соответствующие строки), который реализует ICart:
public abstract class Cart : ICart
{
private List<CartItem> _cartItems = new List<CartItem>();
public List<CartItem> CartItems
{
get
{
return _cartItems;
}
}
}
И мой класс CartItem, который реализует ICartItem:
public abstract class CartItem : ICartItem
{
...
}
Когда я пытаюсь скомпилировать классы, я получаю сообщение об ошибке: «Корзина» не реализует элемент интерфейса «CartItems». «Cart.CartItems» не может реализовать «ICart.CartItems», поскольку у него нет соответствующего возвращаемого типа System.Collections.Generic.List .
Я подумал, что идея здесь в том, что интерфейс может быть реализован несколькими классами, которые выполняют основные функции по-разному и добавляют новые методы и т. Д. Почему моему интерфейсу нужно знать, какой класс на самом деле используется, только если этот класс действительно реализует интерфейс правильно?