【问题标题】:Best practise for implementing multiple interfaces in C#在 C# 中实现多个接口的最佳实践
【发布时间】:2017-03-21 23:45:58
【问题描述】:

我正在一个框架内工作,您可以在其中执行以下操作:

IMyClass instance = Session.GetAllObjectsOfType("IMyClass")[0];
ILock lock = instance as ILock;
if(lock != null)
{
   lock.Lock();
   instance.DoSomething();
   lock.Unlock();
}

ISaveable saveable = instance as ISaveable;
if(saveable != null)
   saveable.save();

为此,我有

class MyClass : IMyClass, ISaveable, ILock
{

}

我实际上需要实现 8-15 个接口,并且需要通过转换主对象来访问它们。实现这一点的最干净的方法是什么?我研究了门面样式,但我认为这里不能使用。

【问题讨论】:

  • 我不明白你的问题。让您的类实现接口,将“mainobject”转换为特定接口,调用其成员,然后就完成了。没有那么多(实际上只有一种)方法可以做到这一点。
  • 我希望有一种比显而易见的方法更好的方法。不同接口的实现会涉及大量代码,而 ILock 接口并不需要了解 ISavebale 功能。我基本上是在寻找一种干净的方法来做到这一点,它不会导致一个类有 5k 行代码和 200 个公共函数。
  • Google“接口隔离原则”——它是 SOLID 原则的一部分。
  • 明确一点:你到底在问什么?您是在问如何编写诸如MyClass 之类的类以与给定框架兼容?或者您是在问如何编写和/或改进框架?与此相关的是,您认为IMyClass 是框架的一部分,还是您的代码的一部分,您可以更改它吗?
  • 我在问,有没有比上面写 MyClass 更好的方法?框架已经完成并且无法更改,IMyClass 不是框架的一部分,它是我应该在框架内工作的东西的实现,最好的解决方案是使用 toadflakz 解决方案,但是因为 MyClass 将包含大量的包装器我希望有一个更清洁的解决方案,但我想不出一个。

标签: c# inheritance design-patterns interface


【解决方案1】:

根据您的评论:

我希望有一种比显而易见的方法更好的方法。不同接口的实现会有很多代码,而 ILock 接口并不需要了解 ISavebale 功能。我基本上是在寻找一种干净的方法来做到这一点,它不会导致一个类有 5k 行代码和 200 个公共函数

如果您希望类实现接口,则该类需要继承接口,但可以注入和包装功能(也称为 Facade)。

这将是实现 ISaveable、ILock 等通用但独立代码类目标的最简洁方法。

例如:

public MyClass : IMyClass, ISaveable, ILock
{
    private readonly ISaveable _saveableImplementation;
    private readonly ILock _lockImplementation;

    public MyClass(ISaveable saveableImplementation, ILock lockImplementation)
    {
        _saveableImplementation = saveableImplementation;
        _lockImplementation - lockImplementation;
    }


    public void ISaveable.Save()
    {
        _saveableImplementation.Save();
    }

    public void ILock.Lock()
    {
        _lockImplementation.Lock();
    }

}

【讨论】:

    猜你喜欢
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多