あなたの質問は非常に広く、コメントで@doogleが述べているように、抽象クラスとインターフェースは必ずしも特定のタイプのプロジェクトに結び付けられているわけではなく、あなたの設計に基づいています。
eコマースまたはストア管理アプリケーションの設計を知らなければ、具体的なヘルプを提供することはできませんが、以前の質問の1つを読むと、抽象クラスとインターフェイスがどのように役立つかを理解しようとしているように見えます。あなた、それでここにあなたを正しい方向に向けるかもしれない何かの基本的な例があります。
架空の店舗には何千もの異なる製品があり、アプリケーションでそれらを追跡したいと考えています。メーカー、価格、部門、数量など、すべての製品に共通するものがあることは明らかですが、特定の製品にのみ適用される可能性のある情報もあります(衣類にはサイズがありますが、DVDにはありません)。
解決策はProduct
、すべての製品に共通であるが、各クラスがインターフェースを実装し、独自のプロパティを追加できるようにするインターフェースを作成することです。これで、すべての製品クラスに少なくともこれらの共通メンバーが含まれることを保証できます。
これが架空の製品インターフェースです。
public interface IProduct
{
decimal SellingPrice { get; set; }
decimal StoreCost { get; set; }
int QuantityOnHand { get; set; }
string Manufacturer { get; set; }
string DepartmentName { get; set; }
decimal CalculateProfit();
}
次に、を実装する抽象クラスを作成できます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つのクエリは、データベースでこれを行うのと同じくらい簡単な例ですが(everythignが格納されている場合)、関連するすべてのアイテムを単一のインターフェイスに結び付ける方法の例を示すために行いました。助けられる