代码之家  ›  专栏  ›  技术社区  ›  Gerrie Schenck

如何处理实现接口并具有基类的类?

  •  0
  • Gerrie Schenck  · 技术社区  · 16 年前

    想象一下下面的代码:

    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类是System.ServiceModel中的类,因此我无法对此进行任何更改。

    5 回复  |  直到 16 年前
        1
  •  1
  •   Gerrie Schenck    16 年前

    接口继承没有问题…

    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();
    

    不过,我认为你同意第一个解决方案要好得多。

        2
  •  2
  •   Thomas Levesque    16 年前

    如果 Start 方法特定于 MyService 类,并且未在中定义 IMyService 接口,您不应该调用 起点 在一 iMyService 引用…

    另一方面,如果有的话 iMyService 实现应该支持 起点 方法,然后应该在接口中定义它

    你可以有这样的东西:

    interface IMyService
    {
        void DoStuff();
        void Start();
    }
    
    abstract class ClientBase
    {
        public void Start() { ... }
    }
    
    class MyService : ClientBase, IMyService
    {
        public void DoStuff() { ... }
    }
    
        3
  •  0
  •   Paddy    16 年前

    如果需要将start方法用作imyservice对象,那么将其放入接口中对我来说是有意义的。否则,对您的设计进行一般性的重新考虑可能是正确的。

        4
  •  0
  •   David Basarab    16 年前

    你犯了什么错误?

    您不应该扩展imyservice来包含clientBase接口。我有实现接口方法的基类。

    我将验证clientBase类上的start方法是公共的,这是所有Interfaces都需要的。

        5
  •  0
  •   Paul Sasik    16 年前

    如何将基类和接口实现聚合到MyService将从中继承的抽象类中。实例化myservice,然后让抽象类作为入口点。您将向类而不是接口进行编码,但我不知道如何使用接口,因为您需要具体的实现。