0

这个问题实际上来自这个链接。

假设我有这样的问题:


书店购买和销售两种类型的书籍:(1) 非技术类{Title, Author, Price} (2) 技术类{Title, Author, Price, CD}

此外,客户在购买技术书籍时会获得一张 CD。CD 对象定义为 CD {Title, Price}。

一本非技术书籍的价格将只是这本书的价格。一本技术书籍的价格将是书籍和 CD 价格的总和。

创建一个 C# 程序以显示以下信息:

Total number of book Bought & Price: XXX & XXX.XX
Total number of book Sold & Price: XXX & XXX.XX
Total Technical Book Sold & Price: XXX & XXX.XX
Total Non-technical Book sold & Price: XXX & XXX.XX

abstract class Publication
{
    public virtual string Title { get; set; }
    public virtual double Price { get; set; }
}

class CD : Publication
{
}

abstract class Book : Publication
{
    public virtual string Author { get; set; }
}

class TechnicalBook : Book
{
    public CD Cd { get; set; }
    public override double Price
    {
        get
        {
            return (base.Price + Cd.Price);
        }
    }
}

class NonTechnicalbook : Book
{
}

class Shop
{
    private IDictionary<string, Book> boughtDictionary;
    private IDictionary<string, Book> soldDictionary;

    public Shop()
    {
        boughtDictionary = new Dictionary<string, Book>();
        soldDictionary = new Dictionary<string, Book>();
    }

    public virtual void Buy(Book item)
    {
        boughtDictionary.Add(item.Title, item);
    }

    public virtual void Sell(string title)
    {
        Book book = boughtDictionary[title];
        boughtDictionary.Remove(book.Title);
        soldDictionary.Add(book.Title, book);
    }

    public virtual int GetBoughtBookCount()
    {
        return boughtDictionary.Count;
    }

    public virtual double GetBoughtBookPrice()
    {
        double price = 0.0;

        foreach (string title in boughtDictionary.Keys)
        {
            price = price + boughtDictionary[title].Price;
        }
    }

    public virtual int GetSoldBookCount()
    {
        return boughtDictionary.Count;
    }

    public virtual double GetSoldBookPrice()
    {
        double price = 0.0;

        foreach (string title in soldDictionary.Keys)
        {
            price = price + soldDictionary[title].Price;
        }
    }

    public virtual double GetTotalBookCount()
    {
        return this.GetBoughtBookCount() + this.GetSoldBookCount();
    }

    public virtual double GetTotalBookPrice()
    {
        return this.GetBoughtBookPrice() + this.GetSoldBookPrice();
    }

    public virtual void Show()
    {
        Console.WriteLine("Total number of books Bought & Price: ", this.GetTotalBookCount() + " & " + this.GetTotalBookPrice());
        Console.WriteLine("Total number of books Sold & Price: ", this.GetSoldBookCount() + " & " + this.GetSoldBookPrice());
    }
}

如何在保持开闭原则的同时显示技术书籍和非技术书籍的价格?

派生 Shop-class 没有任何意义。

如果我编写如下代码:

 if(book is TechnicalBook) {
    // ...
 } else if(book is NonTechnicalBook) {
    // ...
 }

我认为它不会保留 OCP。

那该怎么办?

4

1 回答 1

0

你可以有一个方法

getTotal(Option op)

Option如果 book 是 TechnicalBook 或 NonTechnicalBook,那么如果它符合您的情况下的标准,则 delagte 会在哪里接受一本书并返回 true 。

getTotal方法将遍历所有书籍,仅将 Option 委托返回 true 的书籍相加。并返回总和。

希望这就是你的意思。

于 2012-02-09T16:17:58.070 回答