This is not homework. I am trying to learn OOD principles and design patterns myself.Suppose I have a problem like this:A book-shop buys and sells two types of books:Non-technical {Title, Author, Price}Technical {Title, Author, Price, CD}Also, customer gets a CD when he buys a Technical book. A CD object is  defined as, CD {Title, Price}.A Non-technical book's price will be only the price of the book. A  Technical book's price will be the sum of the price of the book and  the CD. Create a C# program to show the following info:Total number of book Bought & Price: XXX & XXX.XXTotal number of book Sold & Price: XXX & XXX.XXTotal Technical Book Sold & Price: XXX & XXX.XXTotal Non-technical Book sold & Price: XXX & XXX.XXI have designed the program like this: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{}abstract 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());    }}Does this design conform to the Open-Closed principle? Now I am unable to understand how to separate Technical and Non-technical books at this point.
Bookstore classes design
c#