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