Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C语言中实现多个接口的最佳实践#_C#_Inheritance_Design Patterns_Interface - Fatal编程技术网

C# 在C语言中实现多个接口的最佳实践#

C# 在C语言中实现多个接口的最佳实践#,c#,inheritance,design-patterns,interface,C#,Inheritance,Design Patterns,Interface,我在一个框架内工作,您可以执行以下操作: 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(sav

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

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个接口,它们需要通过转换主对象来访问。实现这一点最干净的方法是什么?我查看了外观图案,但我认为这在这里不可用。

根据您的评论:


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

如果您想要一个类来实现该接口,那么该类将需要继承该接口,但是该功能可以被注入和包装(aka 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();
    }

}
根据您的评论:


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

如果您想要一个类来实现该接口,那么该类将需要继承该接口,但是该功能可以被注入和包装(aka 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();
    }

}

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