[英]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.