2010-09-10 63 views
2

我有一个类有不同的添加方法比其他类,因此不能实现相同的接口...我应该拆分当前接口,以便它也可以使用它,或者我应该只是为它创建另一个接口?C# - 接口拆分?

UPDATE:

public interface IProductRepository<T, T2> 
    where T : class 
    where T2 : class 
{ 
    void Add(T model, int categoryId); 
    void Edit(T model, int id); 
    void Delete(int id); 

    T2 Get(int id); 
} 

正如你看到的,然后上面的界面有这需要的categoryId一个Add方法。

我的类别类与上面相同,但Add方法中没有categoryId参数。我应该为Category类创建一个新的界面吗?

+2

你是什么意思与“拆分接口”? – dtb 2010-09-10 23:11:06

+0

一些代码会有所帮助。 Add方法做了什么,这些类有什么关系?你打算使用接口创建类的实例吗?还是仅仅是“合同”的接口? @Svisstack是对的 - 考虑它的用途。 – RPM1984 2010-09-10 23:16:37

回答

1

想想这是什么。

也许你的其他类似乎不喜欢这个接口的功能,而不是做同样的动作(添加)。然后,您可以为这个新的(新的其他)类创建其他接口,或者不用抽象接口就可以让这个类独立。

也许你想对其他类进行一些重构来获得界面中的Add() smillar的定义。

如果你不能重构其他类,这个类似乎有这个接口。 然后你创建其他接口或在旧界面新功能如Add_Extended()增加功能与其他arguemnt名单。

+2

这个回答让我感到困惑的不仅仅是这个问题。 – 2010-09-10 23:15:01

+1

我基本上明白他们在说什么。基本上,*“试着设计你的对象模型,这样不会出现。”*。他们是波兰语,英语很可能是第二语言。 – ChaosPandion 2010-09-10 23:30:24

+0

@ChaosPandion:感谢您的支持;-) – Svisstack 2010-09-10 23:37:07

4

C#允许你明确地实现接口方法:

public class A : IFoo, IBar{ 
    void IFoo.DoSomething() { 
     //DoSomething(); 
    } 
    int IBar.DoSomething() { 
     return -1; 
    } 
} 

这应该让你实现任何接口,即使它与你已经定义的方法签名冲突。被调用的方法取决于它被调用的类型。例如:

((IFoo) new A()).DoSomething(); // ... may do something different than ... 
((IBar) new A()).DoSomething(); // ... would do. 
+2

如果您期望某个对象属于某种类型,那么您确实应该进行施放。尝试调试时,'NullReferenceException'不会很有帮助。 – ChaosPandion 2010-09-10 23:28:11

+0

我同意混沌也可以写成“IFoo foo = new A(); foo.DoSomething();” – 2010-09-10 23:49:06

+1

我希望人们不会认为'as'运算符是更好的选择(cast)。他们是不一样的! – 2010-09-10 23:59:46