Ваш вопрос очень широк и, как указано в комментарии @doogle, абстрактные классы и интерфейсы не обязательно привязаны к конкретному типу проекта, но основаны на вашем дизайне.
Не зная дизайна приложений электронной коммерции или управления магазином, вы не можете дать какую-либо конкретную помощь, но при чтении одного из ваших более ранних вопросов, похоже, вы пытаетесь понять, как абстрактные классы и интерфейсы могут быть в состоянии помочь вам, поэтому вот базовый пример того, что может указывать на вас в правильном направлении.
В гипотетическом магазине у вас есть тысячи разных продуктов, и вы хотите отслеживать их в своем приложении. Очевидно, что есть вещи, общие для всех продуктов, таких как производитель, цена, отдел, количество, но также и части информации, которые могут быть применимы только к конкретным продуктам (одежда будет иметь размер, но DVD не будет).
Решение может заключаться в создании интерфейса Product
, который был бы общим для всех продуктов, но позволял каждому классу реализовывать интерфейс и добавлять свои собственные свойства. Теперь вы можете гарантировать, что любой класс продукта будет иметь, как минимум, эти общие элементы.
Вот гипотетический интерфейс продукта:
Затем вы можете создать абстрактный класс, который реализует IProduct
. Вот одежда продукт, который реализует IProduct
, но и добавляет Size
поля
public abstract class ClothingProduct : IProduct
{
public string Size { get; set; }
public decimal SellingPrice { get; set; }
public decimal StoreCost { get; set; }
public int QuantityOnHand { get; set; }
public string Manufacturer { get; set; }
public string DepartmentName { get; set; }
// by marking CalculateProfits abstract, you can let every class that inherits
// from ClothingProduct decide how to calculate the profit based on the selling
// costs of that product
public abstract decimal CalculateProfit();
}
Теперь, когда у вас есть ClothingProduct
класса, вы могли бы пойти и создать классы для некоторых элементов в хранилище. Вот обувь и рубашки класс:
public class Shirt : ClothingProduct
{
public override CalculateProfit()
{
return this.SellingPrice - this.StoreCost - this.CalculateSellingCosts();
}
private decimal CaclulateSellingCosts()
{
// some code that would let you calculate the selling costs and
// overhead costs associated with this specific product
}
}
public class Shoes : ClothingProduct
{
private const decimal commissionRate = 0.05;
public override CalculateProfit()
{
return this.SellingPrice - this.StoreCost - this.CalculateSellingCosts() - this.CalculateCommission();
}
private decimal CaclulateSellingCosts()
{
// some code that would let you calculate the selling costs and
// overhead costs associated with this specific product
}
private decimal CalculateCommission()
{
return this.SellingPrice * commissionRate;
}
}
В конце концов, как Shoes
и Shirt
являются IProducts
, потому что они наследуют от ClothingProduct
, который в свою очередь реализует IProduct
.
Не могли бы вы создать другие классы или абстрактные классы для других продуктов во всем магазине, но до тех пор, пока инструмент IProduct
, вы можете гарантировать, что у них будут все свойства, которые являются частью IProduct
.
Где это помогает это можно даже создать коллекцию ваших типов интерфейсов и добавить все продукты к ним, так как все реализовать IProduct
// a hypothetical method that grabs everything (maybe from a database)
List<IProduct> products = GetAllProducts();
// this query would give you the total number of items in your inventory
var totalItems = products.Select(quant => quant.QuantityOnHand).Sum();
// and this would calculate the total value of the products based on the store's cost
var totalCost = products.Select(quant => quant.StoreCost).Sum();
В 2 запросы только придуманные примеры, как это было бы так же, как легко сделайте это в базе данных (если это где-то все в магазине), но я просто сделал это, чтобы дать вам пример того, как привязать все связанные элементы обратно к одному интерфейсу может помочь
Этот вопрос кажется слишком открытым. Абстракция не является чем-то специфичным для любого типа проекта, а вместо этого относится к всему дизайну объектной модели. – doogle
Проблема с этим вопросом - ответ, который вы запрашиваете, не поможет. Вы можете знать, как, как вы, похоже, не получили почему. Если у вас есть причины, потенциальные кандидаты в любом приложении будут прыгать на вас. Это не случай, когда вы должны использовать абстракцию, это когда вы должны остановиться ... –