想象一下以下代码:
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的类,因此我无法对此进行任何更改。
答案 0 :(得分:2)
如果Start
方法特定于MyService
类,并且未在IMyService
接口中定义,则不应在{Start
上调用IMyService
1}}参考...
另一方面,如果所有IMyService
实现都应该支持Start
方法,那么它应该在接口中定义
你可以有类似的东西:
interface IMyService
{
void DoStuff();
void Start();
}
abstract class ClientBase
{
public void Start() { ... }
}
class MyService : ClientBase, IMyService
{
public void DoStuff() { ... }
}
答案 1 :(得分:1)
接口继承没有问题......
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 :(得分:0)
如果它需要一个start方法用作IMyService对象,那么将它放在界面中对我来说是有意义的。否则,可能会对您的设计进行一般性重新考虑。
答案 3 :(得分:0)
你得到的错误是什么?
您不应该扩展IMyService以包含ClientBase接口。我有基类实现了接口的方法。
我会验证ClientBase类上的Start方法是否为public,这是所有interfeaces都需要的。
答案 4 :(得分:0)
如何在MyService将继承的抽象类中聚合基类和接口实现。实例化MyService,然后让抽象类成为入口点。你要编写一个类而不是一个接口,但我不知道如何使用一个接口,因为你有具体的实现带来。