2009-09-24 64 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,然後讓抽象類成爲輸入點。你會向編碼類而不是一個接口,但我不知道你怎麼可以只使用一個接口,因爲你有具體的實施帶給你。