繁体   English   中英

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

[英]How to Skip implementation of interface in class

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

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

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

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

只要你能够容忍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();
    }
}

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

您正在寻找抽象方法[wiki]

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

C#中的抽象方法

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

在你的情况下:

interface I1
{
    void M1();
}

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

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

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

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

这样调用它是无效的:

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

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

interface I1 
{
   void someCommonMethod();
}

interface I2 
{
   void M1();
}

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM