C# Bob叔叔'中给出的接口隔离原则示例的实现;s的敏捷原则书
我对图12-1的实现是否正确? 这是Bob叔叔的书《C#中的敏捷原则、模式和实践》中接口污染示例的实现 我已尝试按以下方式实施:-C# Bob叔叔'中给出的接口隔离原则示例的实现;s的敏捷原则书,c#,oop,design-patterns,agile,C#,Oop,Design Patterns,Agile,我对图12-1的实现是否正确? 这是Bob叔叔的书《C#中的敏捷原则、模式和实践》中接口污染示例的实现 我已尝试按以下方式实施:- using System; namespace AgilePrinciplesCSharp.Chapter12.Listing12_2 { class Listing12_2 { static void Main(string[] args) { var door = new TimedDo
using System;
namespace AgilePrinciplesCSharp.Chapter12.Listing12_2
{
class Listing12_2
{
static void Main(string[] args)
{
var door = new TimedDoor();
var client = new Client(door);
client.TimeOut();
}
}
public interface ITimerClient
{
void TimeOut();
}
// We force Door, and therefore (indirectly) TimedDoor, to inherit from TimerClient.
public interface IDoor : ITimerClient
{
void Lock();
void Unlock();
bool IsDoorOpen();
}
// Implementation of Door Interface with Timer functionality
public class TimedDoor : IDoor
{
public bool IsDoorOpen()
{
return true;
}
public void Lock()
{
Console.WriteLine("Door Locked");
}
public void TimeOut()
{
var timer = new Timer();
timer.Register(5, this);
Console.WriteLine("Timeout! Door left open for so long");
}
public void Unlock()
{
Console.WriteLine("Door Unlocked");
}
}
// Timer class can use an object of TimerClient
public class Timer
{
public void Register(int timeout, ITimerClient client)
{
/* CODE */
}
}
// Client uses Door Interface without depending upon any particular implementation of Door
public class Client
{
IDoor door;
public Client(IDoor door)
{
this.door = door;
}
public void TimeOut()
{
door.TimeOut();
}
}
}
我的疑问在于书中描述的实现方式,其中Door有时被称为类,有时被称为接口,我很困惑是否需要在IDOR接口之外有一个单独的Door类实现?
此外,作者在命名接口时没有使用I符号,这使得接口更加混乱
如果有人读过这本书,我希望能理解我的担忧并帮助我解决这个问题
注意:这本书也可以在线阅读。此讨论见第215页。
我相信他使用的是UML类图符号,所以这个图似乎适用于: 如果我读得正确,
TimedDoor
应该继承自Door
。但在您的示例中,TimedDoor
实现了IDoor
。这与图表不一致
宣言应当是:
class TimedDoor : Door
我认为你不需要I或。该示例的主要内容是门
必须实现ITimerClient
,以便计时器
对其执行操作ITimerClient
应该公开一个公共成员,Timeout()
。假定计时器调用此方法时,如果门是定时门,则门应自行解锁。默认行为(例如,对于非定时门)可能是不操作
interface ITimerClient
{
void Timeout();
}
class Door : ITimerClient
{
public virtual void Timeout()
{
//No operation; this isn't a timed door
}
//etc.
}
class TimedDoor : Door
{
protected bool locked = true;
public override void Timeout()
{
this.Unlock(); //Override default behavior because this type of door is timed
base.Timeout(); //Optional, sometimes recommended
}
public virtual void Unlock()
{
this.locked = false;
}
//etc.
}
我相信他使用的是UML类图符号,所以这个图似乎适用于:
如果我读得正确,TimedDoor
应该继承自Door
。但在您的示例中,TimedDoor
实现了IDoor
。这与图表不一致
宣言应当是:
class TimedDoor : Door
我认为你不需要I或。该示例的主要内容是门
必须实现ITimerClient
,以便计时器
对其执行操作ITimerClient
应该公开一个公共成员,Timeout()
。假定计时器调用此方法时,如果门是定时门,则门应自行解锁。默认行为(例如,对于非定时门)可能是不操作
interface ITimerClient
{
void Timeout();
}
class Door : ITimerClient
{
public virtual void Timeout()
{
//No operation; this isn't a timed door
}
//etc.
}
class TimedDoor : Door
{
protected bool locked = true;
public override void Timeout()
{
this.Unlock(); //Override default behavior because this type of door is timed
base.Timeout(); //Optional, sometimes recommended
}
public virtual void Unlock()
{
this.locked = false;
}
//etc.
}
这本书讨论的是接口,不是明确的,也没有使用I
符号?别管它了,我怀疑那里有什么好东西。我开始读这本书,因为它是我的导师Mosh Hamedani在他的一个博客中极力推荐的:我真的很喜欢Mosh的教学方式,并想尝试一下他的建议。不知怎的,这个数字对我来说似乎是错误的。如果TimedDoor实现TimerClient而不是Door,这不是更有意义吗?因为TimedDoor是一个与计时器关联/由计时器控制的门。我已经提供了一个链接来阅读问题本身中的书的内容。这可能会有所帮助。@ckuri这本书讨论的是接口,不是明确的,也没有使用I
符号?别管它了,我怀疑那里有什么好东西。我开始读这本书,因为它是我的导师Mosh Hamedani在他的一个博客中极力推荐的:我真的很喜欢Mosh的教学方式,并想尝试一下他的建议。不知怎的,这个数字对我来说似乎是错误的。如果TimedDoor实现TimerClient而不是Door,这不是更有意义吗?因为TimedDoor是一个与计时器关联/由计时器控制的门。我已经提供了一个链接来阅读问题本身中的书的内容。这可能会有所帮助。@ckuri这正是我以前实现它的方式。但我想知道,客户将如何决定它需要哪种对象。(这应该是一种接口类型,因此它不依赖于任何特定的实现),因此我们也需要处理这些继承/实现(接口)?或者如果我们使用您的实现,客户端是否应该接受实现ITimerClient的任何门?(听起来不像是正确的设计方法)图中没有客户机。它的目的是什么?如果不是对某个对象调用Timeout()
,它可能不需要了解ITimerClient
。好的。很公平。但是,接口需要将超时方法声明为虚拟方法,此实现才能正确(否则将产生编译时错误)。但是如果你在书中看到作者没有将其虚拟化,这也是我不愿意接受它作为正确实现的另一个原因。接口成员在c#中并没有真正使用访问修饰符。他们总是公开的。该图似乎没有提及具有属性或方法的Door
或timeddor
,因此他不应该也不应该标记为virtual。我认为这是为了简洁。这正是我以前实现它的方式。但我想知道,客户将如何决定它需要哪种对象。(这应该是一种接口类型,因此它不依赖于任何特定的实现),因此我们也需要处理这些继承/实现(接口)?或者如果我们使用您的实现,客户端是否应该接受实现ITimerClient的任何门?(听起来不像是正确的设计方法)图中没有客户机。它的目的是什么?如果不是对某个对象调用Timeout()
,它可能不需要了解ITimerClient
。好的。很公平。但是,接口需要将超时方法声明为虚拟方法,此实现才能正确(否则将产生编译时错误)。但是如果你在书中看到Au