问题描述
我目前正在研究使用装饰器模式的示例。 我当前的代码如下所示:
abstract class LibraryItem
{
private int _numcopies;
// Property
public int Numcopies
{
get { return _numcopies; }
set { _numcopies = value; }
}
public abstract void display();
}
/// <summary>
/// The 'ConcreteComponent' class
/// </summary>
class Book : LibraryItem
{
private string _author;
private string _title;
// Constructor
public Book(string author,string title,int numcopies)
{
this._author = author;
this._title = title;
this.Numcopies = numcopies;
}
public override void display()
{
Console.WriteLine("\nBook ------ ");
Console.WriteLine(" Author: {0}",_author);
Console.WriteLine(" Title: {0}",_title);
Console.WriteLine(" # copies: {0}",Numcopies);
}
}
/// <summary>
/// The 'ConcreteComponent' class
/// </summary>
class Video : LibraryItem
{
private string _director;
private string _title;
private int _playTime;
// Constructor
public Video(string director,int numcopies,int playTime)
{
this._director = director;
this._title = title;
this.Numcopies = numcopies;
this._playTime = playTime;
}
public override void display()
{
Console.WriteLine("3");
Console.WriteLine("\nVideo ----- ");
Console.WriteLine(" Director: {0}",_director);
Console.WriteLine(" Title: {0}",Numcopies);
Console.WriteLine(" Playtime: {0}\n",_playTime);
}
}
/// <summary>
/// The 'Decorator' abstract class
/// </summary>
abstract class Decorator : LibraryItem
{
protected LibraryItem libraryItem;
// Constructor
public Decorator(LibraryItem libraryItem)
{
this.libraryItem = libraryItem;
}
public override void display()
{
Console.WriteLine("2");
libraryItem.display();
}
}
/// <summary>
/// The 'ConcreteDecorator' class
/// </summary>
class Borrowable : Decorator
{
protected List<string> borrowers = new List<string>();
// Constructor
public Borrowable(LibraryItem libraryItem)
: base(libraryItem)
{
}
public void BorrowItem(string name)
{
borrowers.Add(name);
libraryItem.Numcopies--;
}
public void ReturnItem(string name)
{
borrowers.Remove(name);
libraryItem.Numcopies++;
}
public override void display()
{
Console.WriteLine("1");
// base.display();
this.libraryItem.display();
foreach (string borrower in borrowers)
{
Console.WriteLine(" borrower: " + borrower);
}
}
}
Video video = new Video("Spielberg","Jaws",23,92);
Borrowable borrowvideo = new Borrowable(video);
我现在想要做的是访问借用视频对象的 Numcopies - 属性。预期值为 23,因为我在视频构造函数中指定了该值,但我得到的值为 0。
有人可以帮助我如何让程序返回 23 吗?
提前致谢!
解决方法
将 NumCopies
设为虚拟并覆盖装饰器基类中的行为。
关于装饰器模式的旁注:
在装饰器模式中,abstract class LibraryItem
应该是一个接口。需要装饰器来实现。