簡體   English   中英

如何處理實現接口並具有基類的類?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM