図書館システムで学ぶオブジェクト指向
継承を使わない場合
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
とそのサブクラスPaperMedia
とEBook
を定義しています。これらのクラスは、タイトルと著者名を持っています。また、各クラスでPrint
メソッドをオーバーライドすることによって、違いを表示することができます。Library
クラスは、複数のメディアを保持するためのリストMedias
を持っています。このクラスには、メディアの追加、削除、検索、セーブ、ロードなどの機能があります。最後に、Program
クラスでは、図書館のインスタンスを生成し、書籍を追加して、JSON形式で保存し、検索することができます。
ディスカッション
コメント一覧
まだ、コメントがありません