多くのデザインブックでは、「実装ではないインターフェイスへのプログラム」という言葉が出てきました。これを遵守して密結合を排除することができ、抽象化も達成できます。私はシナリオを持っていますが、私はこれを実装したいと思いますが、私の限られた知識では分かりません。インターフェイスへのプログラミング
私はクラスといくつかのプロパティセットを持っていました。時間がたつと私の要求が変わり、ItemAssociatedToProduct
とItemAssociatedToOffers
という2つのプロパティを追加するよう強制されました。これらのプロパティを持つオブジェクトを作成すると、私は心配し、Offer
クラスとProduct
クラスを継承してクラスを分割することに決めました。Item
クラスを継承しています。私は私のオブジェクトに具体的な実装を排除すると思った。だから、私のクラスで私はこのようなオブジェクトを作成したい、
Item myItem = new Product() // or Offer()
私は抽象化を達成できるように。しかし、Itemクラスは、派生クラスが持つ追加のプロパティを持っていないので、私はそれを参照することはできません。私はタイプとタイプを識別するために "is"チェックを使用して、それを対応するオブジェクトにキャストすべきだと思った。しかし、再びその茂みの周りのビート。私のシナリオを解決する方法はありませんが、同時に抽象化を遵守するか、この原則はデータ(プロパティ)ではなく行動(メソッド/関数)に使用することのみを意図していますか?
アダム・リス - >それは今正しい?:)
class Program
{
static void Main(string[] args)
{
Item myProduct = new Product();
myProduct.ProductName = "CellPhone";
myProduct.ProductPrice = "$300";
myProduct.ItemType = myProduct.GetProductOrOffer();
Item myOffer = new Offer();
myOffer.ProductName = "CellPhoneCover";
myOffer.ProductPrice = "$0";
myOffer.ItemType = myOffer.GetProductOrOffer();
}
}
interface Item
{
String GetProductOrOffer();
String ProductName
{
get;
set;
}
String ProductPrice
{
get;
set;
}
String ItemType
{
get;
set;
}
}
class Product : Item
{
public String GetProductOrOffer()
{
return "Product";
}
public String ItemType
{
get;
set;
}
public string ProductName
{
get;
set;
}
public string ProductPrice
{
get;
set;
}
}
class Offer : Item
{
public String GetProductOrOffer()
{
return "Offer";
}
public String ItemType
{
get;
set;
}
public string ProductName
{
get;
set;
}
public string ProductPrice
{
get;
set;
}
}
変数を 'Product'または' Offer'型として宣言します。 'Item'は' Product'クラスや 'Offer'クラスについて知るべきではありません。 (新しいサブクラスを追加する場合、 'Item'を変更する必要はありません。)' ItemType'が実際の型を示す場合、コンストラクタは各クラスに対して適切に設定する必要があります。それは不変(const)でなければならず、 'GetProductOrOffer()'は実際に 'GetItemType()'です。 –