如何在类中跳过接口的实现

时间:2014-06-30 14:01:20

标签: c# oop interface

接口 - I1(包含M1方法) 类-C1:I1(c1实现I1) Class-C2:C1(C2继承C1)

interface I1
{
    void M1();
}
class C1 : I1
{
    void M1(){}
}
class C2 : C1
{
}

要求: “C1”中不应该执行“M1”,基本上“M1”需要在“C2”中实现

如何使用任何OOP概念实现这一目标?

5 个答案:

答案 0 :(得分:9)

只要你能够容忍C1是抽象的,这就有效:

interface I1
{
    void M1();
}

abstract class C1 : I1
{
    public abstract void M1();
}

class C2 : C1
{
    public override void M1()
    {
        //
    }
}

编辑:正如评论中提到的Isantipov,您可以避免像这样的抽象类:

class C1 : I1
{
    public virtual void M1()
    {
        throw new NotSupportedException();
    }
}

答案 1 :(得分:5)

使C1抽象化并将M1定义为抽象方法。

答案 2 :(得分:2)

您正在寻找抽象method[wiki]

  

抽象方法是只有签名而没有实现的方法   身体。它通常用于指定子类必须提供   该方法的实施。抽象方法用于指定   某些计算机语言的接口。

Abstract methods in C#

  

抽象方法声明引入了一个新的虚方法   没有提供该方法的实现。代替,   非抽象派生类需要提供自己的派生类   通过覆盖该方法实现。因为抽象的方法   没有提供实际的实现,抽象的方法体   方法只需一个分号。

在你的情况下:

interface I1
{
    void M1();
}

abstract class C1 : I1
{
    public abstract void M1();
}

class C2 : C1
{
    public override void M1()
    {
        // Your code here
    }
}

答案 3 :(得分:1)

您可以使C1抽象,也可以使用显式实现。这意味着它已实现,但不可见。

class C1 : I1
{
    void I1.M1(){ throw new NotImplementedException(); }
}

这样称呼是无效的:

C1 c1 = new C1();
c1.M1(); //Error

答案 4 :(得分:0)

另一种答案 你可以有多个接口。 .NET Fiddle

interface I1 
{
   void someCommonMethod();
}

interface I2 
{
   void M1();
}

然后你的类可以像这样继承。

class C1 : I1
{
    public void someCommonMethod()
    {
        ...
    }
}

class C2 : C1, I2
{
    public void M1()
    {
        ...
    }
}