繁体   English   中英

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

[英]How to approach a class which implements an interface and has a base class?

想象以下代码:

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

MyService类如下所示:

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

现在,我想更改现有代码以使用其接口来调用此类:

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

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

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

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

如果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() { ... }
}

接口继承没有错...

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

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

如果需要将start方法用作IMyService对象,则将其放在接口中对我来说很有意义。 否则,可能需要对设计进行总体重新考虑。

您遇到什么错误?

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

我将验证ClientBase类上的Start方法是否为public,这是所有接口所必需的。

如何在MyService将继承的抽象类中聚合基类和接口实现。 实例化MyService,然后让抽象类成为入口点。 您可能会针对类而不是接口进行编码,但是我不知道如何使用接口,因为您有具体的实现方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM