2017-07-07 107 views
0

我有一個接口:如何從接口覆蓋方法?

interface ISqlite 
{ 
    DataTable select(SQLiteDatabase db); 
} 

和實現它:

public DataTable select(ISqlite s) { 

    return s.select(driver); 

} 

正如你所看到的方法selectDataTable型回報描述。

如何覆蓋此方法,以便它不返回DataTable,而是返回數組或任何其他類型?

我指的是以下幾點:

public Array select(ISqlite s) { 

    return s.select(driver); 

} 
+1

你不能那樣做。 https://en.wikipedia.org/wiki/Liskov_substitution_principle – SLaks

+3

對於要實現接口的類,它必須完全匹配方法的簽名。所以,你需要更新接口和所有實現類。 – juharr

+0

你的意思是我需要編寫額外的界面並將它添加到類中? – ITMANAGER

回答

1

接口進行,以防止你正是這樣做的創建。

相反,這樣做:

interface ISqliteDatatable 
{ 
    DataTable selectDataTable(SQLiteDatabase db); 
} 
interface ISqliteArray 
{ 
    Array selectArray(SQLiteDatabase db); 
} 

然後,當你犯了一個類,決定根據您的需求來實現的接口。

此解決方案可能仍不完全正確,但我們不知道您的整體設計,所以任何進一步的更正將會更高級別。

這裏是你將如何同時實現:

public class example : ISqliteArray : ISqliteDataTable 
{ 

    public DataTable selectDataTable(SQLiteDatabase db) 
    { 
     // Do stuff and return a datatable 
    } 


    public Array selectArray(SQLiteDatabase db) 
    { 
     // Do stuff and return an array 
    } 
} 
+0

好的,那麼怎麼調用其中的一種方法呢?因爲我有一個繼承這兩個接口的類 – ITMANAGER

+0

如果你有一個類實現了這兩個接口並且調用'YourObject.select(db)',那麼你希望它返回什麼? –

+0

編輯更有用。命名約定並不是最好的,但它應該得到重點。如果所有的類都需要兩種方法,你也可以結合這些接口。 – Clay07g

0

可以使用abstract class如果你不不改變的方法(即「覆蓋」,你在你的問題中寫道) 考慮的返回類型需要繼承另一個類,您將有能力指定方法的默認實現。
您需要爲每個返回類型編寫一個單獨的方法。

+0

我刪除了我的評論,因爲我不確定,但仍嘗試了幾件事情之後,「類型參數聲明必須是標識符,而不是類型」。 –

+0

我的意思是,我認爲真正的答案是OP正在嘗試創建合同(接口),然後通過更改實現中的接口來破壞合同。所以它不能也不應該做。但是,只是出於好奇而嘗試。我嘗試的另一件事是'公共T選擇(SQLiteDatabase數據庫)其中T:DataTable'但你得到「約束必須匹配接口方法的參數約束」。 –

+0

@ChrisBerger你是對的,我會改變或刪除答案,很奇怪,因爲visual studio在設計時沒有顯示任何錯誤,當我嘗試時。 – jonathana