2010-02-25 63 views
3

我问了类似的问题,但仍然没有一个清晰的想法。我的目标是部分实现在C#中的一个接口。部分实现接口

可能吗?有什么模式可以达到这个结果吗?

+0

为什么你想这样做?界面的其他部分有什么问题 - 你不想实现的部分? – 2010-02-25 19:16:11

+1

我不认为你明白接口的意义。你想做什么? – SLaks 2010-02-25 19:16:19

+4

也许界面实际上应该是两个界面? – Greg 2010-02-25 19:17:31

回答

13

接口定义合同。如果您想使用它,您必须通过实施其所有成员来履行该合同。

也许抽象类的使用最适合你,这样你可以定义一些默认行为,同时允许覆盖你需要的地方。

+0

@Dan:“如果你想使用它,你必须通过实现它的所有成员来履行合同。”不总是。杰森提出了一个很好的反例:IEnumerator。 – 2010-02-25 19:31:42

8

对于您不想实现的方法,您可以抛出NotImplementedException,对于不能实现的方法,您可以抛出NotSupportedException

最好不要这样做,但是在.NET框架中有些地方抛出了类NotSupportedExceptionStream的设计,这很强制您为某些方法抛出此异常。

MSDN约NotSupportedException异常:

被抛出时,不支持的调用的方法,或异常时,有阅读,寻求,或写入不支持调用流的尝试功能。

+0

实际上,如果枚举器不支持重置到初始位置,那么'IEnumerator.Reset'的准则是抛出'NotSupportedException'。 – jason 2010-02-25 19:20:11

+0

@Jason,是的,有些Streams也可以做到这一点(请参阅我的更新)。但是我个人认为抽象的Stream类是一个丑陋的设计。但事情就是这样,所以在某些情况下你几乎不得不抛出NotSupportedException。制作几个不同的Stream接口可能会更好。我想知道如果他们不得不从头开始重新设计,那么制作Stream类的团队是否会做出相同的设计选择。 – 2010-02-25 19:23:55

2

正如其他人所说的界面应得到充分实施(虽然这种情况有解决办法像扔NotSupportedExceptions)

你应该的接口分离原则看一看的SOLID priciples(一个罗伯特马丁讨论),并找出你是否真的需要多个接口,然后类可以选择实现哪些接口

2

是的,你可以部分实现接口,如果你使用类似这样的抽象类:

public interface myinterface 
{ 
    void a(); 
    void b(); 
} 
public abstract class myclass : myinterface 
{ 
    public void a() 
    { 
     ///do something 
    } 

    public abstract void b(); // keep this abstract and then implement it in child class 
} 
0

和其他帖子一样,除了隐藏成员之外,抛出异常是最好的选择。

interface IPartial 
{ 
    void A(); 
    void B(); 
} 

class Partial : IPartial 
{ 
    public void A() 
    { 
     // Implementation here 
    } 
    void IPartial.B() 
    { 
     throw new NotImplementedException(); 
    } 
} 

class Main 
{ 
    Main() 
    { 
     Partial t = new Partial(); 
     t.A(); 
     t.B(); // Compiler error 

     IPartial s = new Partial(); 
     s.A(); 
     s.B(); // Runtime error 
    } 
}