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

时间:2009-09-24 12:37:48

标签: c# inheritance interface

想象一下以下代码:

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

5 个答案:

答案 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,然后让抽象类成为入口点。你要编写一个类而不是一个接口,但我不知道如何使用一个接口,因为你有具体的实现带来。