C# Bob叔叔'中给出的接口隔离原则示例的实现;s的敏捷原则书

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

我对图12-1的实现是否正确?

这是Bob叔叔的书《C#中的敏捷原则、模式和实践》中接口污染示例的实现

我已尝试按以下方式实施:-

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