проблемы с расширенными классами и перезаписать с методами - PullRequest
3 голосов
/ 09 июня 2010

У меня есть веб-сайт .net, написанный на C #, и я буду использовать функции, которые могут использовать другие разработчики.Поэтому я сделаю некоторую реализацию по умолчанию, и разработчик может перезаписать некоторые методы

Пример: у меня есть класс ShoppingCart и класс Product, у продукта класса есть метод getProductPrice, магазинная тележка вызовет методgetProductPrice для расчета общей цены корзины

ShoppingCart и Product находятся в одном проекте, и я дам разработчикам .dll, чтобы они не могли изменить исходный код, чтобы мы моглипозже обновите сборку

Поэтому им нужно создать другой проект, расширить класс продукта и перезаписать метод getProductPrice, чтобы они могли реализовать свою собственную логику. Проблема в том, что корзина покупок не будет вызывать расширенный метод, нооригинал

Если мы уже создадим расширенный проект для разработчиков, и корзина покупок вызовет расширенный метод, то у нас будет циклическая ссылка, потому что расширенному продукту нужна ссылка на продукт, а корзина покупок на расширенный продукт

Частичные классы также не работают, потому что мы только сЧастицы использования в одной сборке

У кого-нибудь есть предложения?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 09 июня 2010

Вы должны пометить все ваши Product методы как virtual :

public virtual decimal GetProductPrice() { };

Тогда разработчики, которые возьмут на себя управление позже, смогут наследовать от продукта и переопределить метод:

public class OverriddenProduct : Product
{
   public override decimal GetProductPrice() { }
}

Поскольку OverridenProduct (в моем примере выше) наследуется от Product, он все равно может быть добавлен в коллекцию Product в вашем классе ShoppingCart.

Просто symantics Iпредположите, но метод класса ShoppingCart, вероятно, должен быть GetTotalPrice(), а не GetProductPrice(), так как я предполагаю, что вы получаете общую стоимость продуктов в корзине.

0 голосов
/ 09 июня 2010

Объявите ваш метод как виртуальный метод. Это позволяет вам переопределить его в наследующем классе, чтобы любые вызовы к нему всегда направлялись в переопределяющую реализацию. Подробнее о виртуальных методах .

Кроме того, GetProductPrice звучит как что-то, что может быть лучше реализовать как свойство вместо метода.

...