【问题标题】:How to approach a class which implements an interface and has a base class?如何处理实现接口并具有基类的类?
【发布时间】:2009-09-24 12:37:47
【问题描述】:

想象一下下面的代码:

MyService myService = new MyService();
myService.Start();
myService.DoStuff();

MyService 类如下所示:

public class MyService : ClientBase, IMyService
{
...
}

现在我想更改现有代码以使用它的接口调用这个类:

IMyService myService = GetMyService();
myService.Start();
myService.DoStuff();

看起来更好,但现在我在包含myService.Start(); 的行上收到错误,因为这是从ClientBase 基类继承的实现。

我现在该怎么办?扩展IMyService 接口并包含ClientBase 接口?这是我现在能想到的唯一解决方案,但我认为它不是很优雅......

编辑:ClientBase 类是 System.ServiceModel 中的类,因此我无法对此进行任何更改。

【问题讨论】:

    标签: c# inheritance interface


    【解决方案1】:

    如果Start 方法特定于MyService 类,并且未在IMyService 接口中定义,则不应在IMyService 引用上调用Start...

    另一方面,如果所有IMyService 实现都应该支持Start 方法,那么它应该在接口中定义

    你可以有类似的东西:

    interface IMyService
    {
        void DoStuff();
        void Start();
    }
    
    abstract class ClientBase
    {
        public void Start() { ... }
    }
    
    class MyService : ClientBase, IMyService
    {
        public void DoStuff() { ... }
    }
    

    【讨论】:

    • 好吧调用代码依赖于Start方法,但是它当然不知道它是来自基类的方法而不是接口上的方法。目前只有一个接口实现......我只想制作一个新的用于单元测试目的(创建一个存根)。
    【解决方案2】:

    接口继承没有错……

    public class ClientBase: IClientBase
    {
        public ClientBase()
        {
        }
    
        public void Start()
        {
        }  
    }
    
    public interface IClientBase
    {
        void Start();
    }
    
    ...
    
    public class MyService: ClientBase, IClientBase, IMyService
    {
        public MyService()
        {
        }
    
        public void DoStuff()
        {
        }
    }
    
    public interface IMyService: IClientBase
    {
        void DoStuff();
    }
    

    那么你应该被允许使用你现有的代码:

    IMyService service = new MyService();
    service.Start();
    service.DoStuff();
    

    另一种解决方案是让您的 MyService 类实现 IClientBase,然后进行强制转换:

    MyService service = new MyService();
    (service as IClientBase).Start();
    (service as IMyService).DoStuff();
    

    但是,我认为您同意第一个解决方案要好得多。

    【讨论】:

    • ClientBase 类是 System.ServiceModel 中的类,没有接口,所以我认为这不是我的选择。还是谢谢。
    • 您在您的 OP 中提到它确实 “我现在应该做什么?扩展 IMyService 接口并包含 ClientBase 接口”
    • 中间还有一门课,所以你的第一个答案是正确的。我回滚了你的编辑,谢谢。
    【解决方案3】:

    如果它需要一个 start 方法来用作 IMyService 对象,那么将它放在接口中对我来说是有意义的。否则,您可能需要重新考虑您的设计。

    【讨论】:

    • 这个不是我设计的,但我当然可以改:)
    【解决方案4】:

    您遇到的错误是什么?

    您不应扩展 IMyService 以包含 ClientBase 接口。我有实现接口方法的基类。

    我会验证 ClientBase 类上的 Start 方法是公共的,这是所有接口都需要的。

    【讨论】:

      【解决方案5】:

      如何将基类和接口实现聚合到 MyService 将继承的抽象类中。实例化 MyService,然后让抽象类成为入口点。您将针对类而不是接口进行编码,但我不知道您如何只使用接口,因为您有具体的实现要随身携带。

      【讨论】:

        猜你喜欢
        • 2013-09-30
        • 2016-07-22
        • 2013-02-01
        • 2016-01-26
        • 2013-09-11
        • 2011-11-30
        • 1970-01-01
        • 2014-06-17
        • 1970-01-01
        相关资源
        最近更新 更多