2009-09-24 60 views
0

想象一下下面的代码:如何访问实现接口并具有基类的类?

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类,所以我不能改变任何关于此。

回答

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

但是,我想y我同意第一个解决方案好得多。

+0

的ClientBase类是从System.ServiceModel的一个,没有一个接口,所以这不是我的选择,我认为。不管怎么说,还是要谢谢你。 – 2009-09-24 12:52:30

+0

你已经在你的OP,它不*“我现在应该怎么办?扩展IMyService接口包括ClientBase界面” * – James 2009-09-24 14:15:00

+0

有隔着其他课上提到,所以你的第一个答案是正确的。我把你的编辑回来了,谢谢。 – 2009-09-25 07:46:58

2

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

那么调用代码依赖于Start方法,但当然不知道它是从基类,而不是接口的方法的方法。目前只有一个接口的实现......我只是想为单元测试的目的(创造一个stub)一个新的。 – 2009-09-24 12:45:12

0

如果需要将启动方法用作IMyService对象,那么将它放入界面对我来说很有意义。否则,可能需要对您的设计进行一般性重新考虑。

+0

我没有做这样的设计,但我当然可以改变它:) – 2009-09-24 12:53:29

0

你得到的错误是什么?

您不应该扩展IMyService以包含ClientBase接口。我有基类实现了接口的方法。

我会验证ClientBase类的Start方法是公开的,这是所有干扰所需要的。

0

如何在MyService将继承的抽象类中聚合基类和接口实现。实例化MyService,然后让抽象类成为输入点。你会向编码类而不是一个接口,但我不知道你怎么可以只使用一个接口,因为你有具体的实施带给你。