オブジェクト指向プログラミング入門 – 商品価格表示プログラム

オブジェクト指向プログラミングの概要

オブジェクト指向プログラミング(OOP)は、データとそれに関連する機能を「オブジェクト」としてまとめて扱う方法です。これにより、コードの再利用性や拡張性が向上します。


サンプルプログラムの概要

基本的なShopクラスを用いて、商品名に応じて価格を表示するプログラムを作成します。

class Program
{
    static void Main()
    {
        Shop shop = new Shop();
        shop.DisplayPrice("薬草");
        shop.DisplayPrice("棍棒");
        shop.DisplayPrice("ポーション");
    }
}

class Shop
{
    public void DisplayPrice(string itemName)
    {
        if (itemName == "薬草")
        {
            Console.WriteLine(itemName + "は100円です");
        }
        else if (itemName == "棍棒")
        {
            Console.WriteLine(itemName + "は1500円です");
        }
        else
        {
            Console.WriteLine("売り切れです");
        }
    }
}

Shopクラスの拡張

異なるショップのインスタンスを作成し、それぞれの商品情報を表示するプログラムを作成します。

class Shop
{
    public string Name { get; set; }
    public Dictionary<string, int> Items { get; set; }

    public Shop(string name)
    {
        Name = name;
        Items = new Dictionary<string, int>();
    }

    public void AddItem(string itemName, int price)
    {
        Items[itemName] = price;
    }

    public void DisplayPrice(string itemName)
    {
        if (Items.ContainsKey(itemName))
        {
            Console.WriteLine($"{Name} - {itemName}は{Items[itemName]}円です");
        }
        else
        {
            Console.WriteLine($"{Name} - {itemName}は売り切れです");
        }
    }
}

class Program
{
    static void Main()
    {
        Shop generalShop = new Shop("一般店");
        generalShop.AddItem("薬草", 100);
        generalShop.AddItem("棍棒", 1500);

        Shop discountShop = new Shop("割引店");
        discountShop.AddItem("薬草", 80);
        discountShop.AddItem("棍棒", 1200);

        generalShop.DisplayPrice("薬草");
        generalShop.DisplayPrice("棍棒");

        discountShop.DisplayPrice("薬草");
        discountShop.DisplayPrice("棍棒");
    }
}

ポリモーフィズムの概念

ポリモーフィズムを取り入れたサンプルで、異なるクラスが同じメソッドを持つことを示します。

abstract class Shop
{
    public abstract void DisplayPrice(string itemName);
}

class GeneralShop : Shop
{
    public override void DisplayPrice(string itemName)
    {
        if (itemName == "薬草")
        {
            Console.WriteLine(itemName + "は100円です");
        }
        else if (itemName == "棍棒")
        {
            Console.WriteLine(itemName + "は1500円です");
        }
        else
        {
            Console.WriteLine("売り切れです");
        }
    }
}

class DiscountShop : Shop
{
    public override void DisplayPrice(string itemName)
    {
        if (itemName == "薬草")
        {
            Console.WriteLine(itemName + "は80円です");
        }
        else if (itemName == "棍棒")
        {
            Console.WriteLine(itemName + "は1200円です");
        }
        else
        {
            Console.WriteLine("売り切れです");
        }
    }
}

class LuxuryShop : Shop
{
    public override void DisplayPrice(string itemName)
    {
        if (itemName == "薬草")
        {
            Console.WriteLine(itemName + "は200円です");
        }
        else if (itemName == "棍棒")
        {
            Console.WriteLine(itemName + "は3000円です");
        }
        else
        {
            Console.WriteLine("売り切れです");
        }
    }
}

class Program
{
    static void Main()
    {
        Shop[] shops = {
            new GeneralShop(),
            new DiscountShop(),
            new LuxuryShop()
        };

        foreach (var shop in shops)
        {
            shop.DisplayPrice("薬草");
            shop.DisplayPrice("棍棒");
        }
    }
}

クラス図

説明

  • Shop: 抽象クラスで、DisplayPriceメソッドを抽象メソッドとして宣言しています。
  • GeneralShopDiscountShopLuxuryShop: すべてShopクラスを継承し、それぞれ独自のDisplayPriceメソッドを実装しています。
  • Program: メインクラスで、複数のショップインスタンスを作成し、商品価格を表示するメソッドを呼び出します。

この図により、クラス間の継承関係と各クラスの役割を視覚的に理解できます。

オブジェクト指向のメリット

  • 再利用性: 各Shopインスタンスは共通の構造を持ち、異なる商品情報を簡単に追加できます。
  • 拡張性: 新しいショップの種類を追加する際に、既存のコードを変更する必要がありません。
  • 保守性: 各Shopインスタンスは独立しており、バグ修正や機能追加が容易です。

まとめ

オブジェクト指向プログラミングにより、コードの再利用性、拡張性、保守性が向上します。異なるShopクラスのインスタンスを使うことで、これらのメリットを実感できます。ポリモーフィズムを利用することで、コードの柔軟性と拡張性がさらに高まり、異なるオブジェクトが同じメソッドを持ちながら異なる動作をすることができます。

参考