図書館システムで学ぶオブジェクト指向

2023年1月31日

継承を使わない場合

using System;
using System.Text.Json;
using System.Collections.Generic;

namespace LibrarySystem
{
    // 紙媒体のクラス
    public class PaperMedia
    {
        public string Title { get; set; }
        public string Author { get; set; }
        public int Pages { get; set; }
        public bool InStock { get; set; }

        public PaperMedia(string title, string author, int pages)
        {
            Title = title;
            Author = author;
            Pages = pages;
            InStock = true;
        }

        public void Lend()
        {
            if (InStock)
            {
                Console.WriteLine($"{Title} by {Author} is lent.");
                InStock = false;
            }
            else
            {
                Console.WriteLine($"{Title} by {Author} is not available.");
            }
        }

        public void Return()
        {
            if (!InStock)
            {
                Console.WriteLine($"{Title} by {Author} is returned.");
                InStock = true;
            }
            else
            {
                Console.WriteLine($"{Title} by {Author} is already in stock.");
            }
        }
    }

    // 電子書籍のクラス
    public class EBook
    {
        public string Title { get; set; }
        public string Author { get; set; }
        public string Format { get; set; }
        public bool InStock { get; set; }

        public EBook(string title, string author, string format)
        {
            Title = title;
            Author = author;
            Format = format;
            InStock = true;
        }

        public void Lend()
        {
            if (InStock)
            {
                Console.WriteLine($"{Title} by {Author} is lent.");
                InStock = false;
            }
            else
            {
                Console.WriteLine($"{Title} by {Author} is not available.");
            }
        }

        public void Return()
        {
            if (!InStock)
            {
                Console.WriteLine($"{Title} by {Author} is returned.");
                InStock = true;
            }
            else
            {
                Console.WriteLine($"{Title} by {Author} is already in stock.");
            }
        }
    }

    // 図書館のクラス
    public class Library
    {
        public List<PaperMedia> PaperMedias { get; set; }
        public List<EBook> EBooks { get; set; }

        public Library()
        {
            PaperMedias = new List<PaperMedia>();
            EBooks = new List<EBook>();
        }

        public void AddPaperMedia(PaperMedia paperMedia)
        {
            PaperMedias.Add(paperMedia);
        }

        public void AddEBook(EBook eBook)
        {
            EBooks.Add(eBook);
        }

        public void RemovePaperMedia(PaperMedia paperMedia)
        {
            PaperMedias.Remove(paperMedia);
        }

        public void RemoveEBook(EBook eBook)
        {
            EBooks.Remove(eBook);
        }

        public void Search(string keyword)
        {
            Console.WriteLine("Paper Media:");
            foreach (var paperMedia in PaperMedias)
            {
                if (paperMedia.Title.Contains(keyword) || paperMedia.Author.Contains(keyword))
                {
                    Console.WriteLine($"Title: {paperMedia.Title}, Author: {paperMedia.Author}");
                }
            }
            Console.WriteLine("E-books:");
            foreach (var eBook in EBooks)
            {
                if (eBook.Title.Contains(keyword) || eBook.Author.Contains(keyword))
                {
                    Console.WriteLine($"Title: {eBook.Title}, Author: {eBook.Author}");
                }
            }
        }

        public void Save()
        {
            var options = new JsonSerializerOptions
            {
                WriteIndented = true
            };
            var json = JsonSerializer.Serialize(this, options);
            System.IO.File.WriteAllText("library.json", json);
        }

        public static Library Load()
        {
            var json = System.IO.File.ReadAllText("library.json");
            return JsonSerializer.Deserialize<Library>(json);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var library = new Library();
            var paperMedia1 = new PaperMedia("Book 1", "Author 1", 100);
            var paperMedia2 = new PaperMedia("Book 2", "Author 2", 200);
            var eBook1 = new EBook("E-Book 1", "Author 3", "PDF");
            var eBook2 = new EBook("E-Book 2", "Author 4", "EPUB");

            library.AddPaperMedia(paperMedia1);
            library.AddPaperMedia(paperMedia2);
            library.AddEBook(eBook1);
            library.AddEBook(eBook2);

            library.Save();

            var loadedLibrary = Library.Load();
            loadedLibrary.Search("1");

            Console.ReadLine();
        }
    }
}

このコードは、図書館のシステムを表すC#のクラスです。

  • PaperMediaクラスは紙媒体の本を表すクラスです。各本のタイトル、著者、ページ数、在庫情報を保持するプロパティを持っています。
  • EBookクラスは電子書籍を表すクラスです。各電子書籍のタイトル、著者、フォーマット、在庫情報を保持するプロパティを持っています。
  • Libraryクラスは図書館全体を表すクラスです。紙媒体と電子書籍のリストを持っています。また、紙媒体と電子書籍を追加/削除するメソッド、キーワード検索するメソッド、保存するメソッド、読み込むメソッドもあります。
  • ProgramクラスはC#アプリケーションのエントリポイントです。図書館にいくつかの紙媒体と電子書籍を追加し、検索と貸出/返却を行い、最後に保存します。

継承を使った場合

using System;
using System.Collections.Generic;
using System.Text.Json;

namespace LibrarySystem
{
    class Media
    {
        public string Title { get; set; }
        public string Author { get; set; }

        public Media(string title, string author)
        {
            Title = title;
            Author = author;
        }
    }

    class PaperMedia : Media
    {
        public int Pages { get; set; }

        public PaperMedia(string title, string author, int pages) : base(title, author)
        {
            Pages = pages;
        }
    }

    class EBook : Media
    {
        public string Format { get; set; }

        public EBook(string title, string author, string format) : base(title, author)
        {
            Format = format;
        }
    }

    class Library
    {
        public List<PaperMedia> PaperMedias { get; set; } = new List<PaperMedia>();
        public List<EBook> EBooks { get; set; } = new List<EBook>();

        public void AddPaperMedia(PaperMedia paperMedia)
        {
            PaperMedias.Add(paperMedia);
        }

        public void AddEBook(EBook eBook)
        {
            EBooks.Add(eBook);
        }

        public void RemovePaperMedia(PaperMedia paperMedia)
        {
            PaperMedias.Remove(paperMedia);
        }

        public void RemoveEBook(EBook eBook)
        {
            EBooks.Remove(eBook);
        }

        public void Search(string keyword)
        {
            Console.WriteLine("Paper Media:");
            foreach (var paperMedia in PaperMedias)
            {
                if (paperMedia.Title.Contains(keyword) || paperMedia.Author.Contains(keyword))
                {
                    Console.WriteLine($"Title: {paperMedia.Title}, Author: {paperMedia.Author}");
                }
            }
            Console.WriteLine("E-books:");
            foreach (var eBook in EBooks)
            {
                if (eBook.Title.Contains(keyword) || eBook.Author.Contains(keyword))
                {
                    Console.WriteLine($"Title: {eBook.Title}, Author: {eBook.Author}");
                }
            }
        }

        public void Save()
        {
            var options = new JsonSerializerOptions
            {
                WriteIndented = true
            };
            var json = JsonSerializer.Serialize(this, options);
            System.IO.File.WriteAllText("library.json", json);
        }

        public static Library Load()
        {
            var json = System.IO.File.ReadAllText("library.json");
            return JsonSerializer.Deserialize<Library>(json);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var library = new Library();
            var paperMedia1 = new PaperMedia("Book 1", "Author 1", 100);
            var paperMedia2 = new PaperMedia("Book 2", "Author 2", 200);
            var eBook1 = new EBook("E-Book 1", "Author 3", "PDF");
            var eBook2 = new EBook("E-Book 2", "Author 4", "EPUB");

            library.AddPaperMedia(paperMedia1);
            library.AddPaperMedia(paperMedia2);
            library.AddEBook(eBook1);
            library.AddEBook(eBook2);

            library.Save();

            var loadedLibrary = Library.Load();
            loadedLibrary.Search("1");

            Console.ReadLine();
        }
    }
}

このコードは、図書館管理システムのクラス定義を行っています。

  • クラスMediaは、メディア(書籍や電子書籍など)の情報を保持するためのクラスです。このクラスは、タイトルと著者のプロパティを持っています。
  • クラスPaperMediaは、Mediaクラスを継承したクラスです。このクラスは、PaperMediaオブジェクトに対してページ数を保持するためのページプロパティを追加しています。
  • クラスEBookは、Mediaクラスを継承したクラスです。このクラスは、EBookオブジェクトに対してフォーマットを保持するためのフォーマットプロパティを追加しています。
  • クラスLibraryは、図書館に含まれるPaperMediaとEBookオブジェクトを管理するためのクラスです。このクラスは、PaperMediasとEBooksのリストを持っています。このクラスは、AddPaperMediaメソッド、AddEBookメソッド、RemovePaperMediaメソッド、RemoveEBookメソッド、Searchメソッド、Saveメソッド、Loadメソッドを持っています。
  • クラスProgramは、メイン関数を定義しています。このクラスでは、Libraryオブジェクトを作成し、PaperMediaオブジェクトとEBookオブジェクトを追加し、保存します。また、保存されたデータをロードし、検索します。

このコードでは、System.Collections.Generic、System.Text.Jsonライブラリを使用しています。 System.Text.Jsonライブラリを使用することで、図書館オブジェクトをJSON形式で保存、読み込みすることができます。

ポリモーフィズムを使った場合

using System;
using System.Collections.Generic;
using System.Text.Json;

namespace LibrarySystem
{
    abstract class Media
    {
        public string Title { get; set; }
        public string Author { get; set; }

        public Media(string title, string author)
        {
            Title = title;
            Author = author;
        }

        public abstract void Print();
    }

    class PaperMedia : Media
    {
        public int Pages { get; set; }

        public PaperMedia(string title, string author, int pages) : base(title, author)
        {
            Pages = pages;
        }

        public override void Print()
        {
            Console.WriteLine($"Title: {Title}, Author: {Author}, Pages: {Pages}");
        }
    }

    class EBook : Media
    {
        public string Format { get; set; }

        public EBook(string title, string author, string format) : base(title, author)
        {
            Format = format;
        }

        public override void Print()
        {
            Console.WriteLine($"Title: {Title}, Author: {Author}, Format: {Format}");
        }
    }

    class Library
    {
        public List<Media> Medias { get; set; } = new List<Media>();

        public void AddMedia(Media media)
        {
            Medias.Add(media);
        }

        public void RemoveMedia(Media media)
        {
            Medias.Remove(media);
        }

        public void Search(string keyword)
        {
            Console.WriteLine("Medias:");
            foreach (var media in Medias)
            {
                if (media.Title.Contains(keyword) || media.Author.Contains(keyword))
                {
                    media.Print();
                }
            }
        }

        public void Save()
        {
            var options = new JsonSerializerOptions
            {
                WriteIndented = true
            };
            var json = JsonSerializer.Serialize(this, options);
            System.IO.File.WriteAllText("library.json", json);
        }

        public static Library Load()
        {
            var json = System.IO.File.ReadAllText("library.json");
            return JsonSerializer.Deserialize<Library>(json);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var library = new Library();
            library.AddMedia(new PaperMedia("The Great Gatsby", "F. Scott Fitzgerald", 180));
            library.AddMedia(new EBook("The Hitchhiker's Guide to the Galaxy", "Douglas Adams", "pdf"));
            library.Save();

            var loadedLibrary = Library.Load();
            loadedLibrary.Search("The");
        }
    }
}

MediaとそのサブクラスPaperMediaEBookを定義しています。これらのクラスは、タイトルと著者名を持っています。また、各クラスでPrintメソッドをオーバーライドすることによって、違いを表示することができます。
Libraryクラスは、複数のメディアを保持するためのリストMediasを持っています。このクラスには、メディアの追加、削除、検索、セーブ、ロードなどの機能があります。最後に、Programクラスでは、図書館のインスタンスを生成し、書籍を追加して、JSON形式で保存し、検索することができます。