2017-07-07 68 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