Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用接口如何克服C#中的多重继承问题?_C#_Oop_Inheritance_Interface_Multiple Inheritance - Fatal编程技术网

使用接口如何克服C#中的多重继承问题?

使用接口如何克服C#中的多重继承问题?,c#,oop,inheritance,interface,multiple-inheritance,C#,Oop,Inheritance,Interface,Multiple Inheritance,我知道C#不支持多重继承,解决方案是使用接口。但我不明白的是,为什么接口不会像多重继承那样产生菱形问题。使用接口如何避免多重继承的陷阱?一个类可以实现任意数量的接口,即使这些接口也扩展了其他接口。多重继承不可能仅用于类 类存在菱形问题,因为存在冲突实现的可能性(如果a和B使用相同的方法,而C同时扩展了这两种方法,则采用哪种方法?)。另一方面,接口只需要实现类型就可以拥有它们声明的方法 如果在两个接口中定义了完全相同的方法,并且一个类实现了这两个接口,那么这并不重要。该类需要做的就是为该方法提供一

我知道C#不支持多重继承,解决方案是使用接口。但我不明白的是,为什么接口不会像多重继承那样产生菱形问题。使用接口如何避免多重继承的陷阱?

一个类可以实现任意数量的接口,即使这些接口也扩展了其他接口。多重继承不可能仅用于类

类存在菱形问题,因为存在冲突实现的可能性(如果
a
B
使用相同的方法,而
C
同时扩展了这两种方法,则采用哪种方法?)。另一方面,接口只需要实现类型就可以拥有它们声明的方法

如果在两个接口中定义了完全相同的方法,并且一个类实现了这两个接口,那么这并不重要。该类需要做的就是为该方法提供一个实现,以便编写代码来调用该方法。这意味着:

interface IA { void Method(int x); }
interface IB { void Method(int x); }

class A : IA, IB
{
    public void Method(int x)
    {
        Console.WriteLine(x);
    }
}
请注意,一个类仍然可以从另一个类继承,加上任何数量的接口:

class A : B, IA, IB {}

多个接口不会产生菱形问题,因为每个类都必须提供自己独特的实现,这意味着不存在资源共享


C#不允许多重继承,因为他们关心你,并使语言尽可能地自我保护。

你一次只能继承一个类和无限数量的接口。

钻石问题仅在使用接口时不存在,因为不可能有不明确的实现。阅读包含完整解释的。如果您询问继承:类只能继承一个类,但可以实现任意数量的接口。请参阅关于C#

中的继承和多态性的文章。我认为仅在
C#
的范围内考虑这一点是不公平的


CLR
本身不支持多重继承。可能是因为他们想支持当前不支持或将来无法支持的其他语言。

这是一种可能的方法,可以尝试实现通常可以通过多重继承实现的目标

interface IA
{
    void DoAnything(string name);
}

class A : IA
{
    public void DoSomething()
    {
        // some code
    }
    public void DoAnything(string name)
    {
        // Some code
    }
}

class B : IA
{
    public void DoNothing()
    {
        // Some code
    }

    public void DoAnything(string name)
    {
        // Some code
    }
}

class StorageCache : IA
{
    private A ObjA;
    private B ObjB;

    public void DoAnything(string name)
    {
        ObjA.DoAnything(name);
        ObjB.DoAnything(name);
    }
    public void DoNothing()
    {
        ObjB.DoNothing();
    }
    public void DoSomething()
    {
        ObjA.DoSomething();
    }
}

对不起,你的问题不清楚。你能更清楚地说明你的问题吗?你说的这个“MI”是什么?@RPM1984:可能是多重继承(不是标题中的多重接口)…解决方案是C提供接口-这不是多重继承,而是多重实现。关于c#多重继承的问题已经有很多,术语“继承”包括两个相互正交的概念:可扩展性和可替换性。接口提供后者而不提供前者;作文提供了前者(如果笨拙的话),但没有提供后者。你怎么知道他在问什么@特布里奇:这只是一个胡乱的猜测。否决票不是我投的,但我能理解。你的答案并没有真正触及钻石问题,钻石问题与名称恰好匹配的方法无关。最好显示两个实现公共IBase的接口,以及一个实现两个接口的类。接口不存在菱形问题的原因是,如果一个类MyThing实现了IList和ICollection(两者都继承了IEnumerable),那么该类只实现一次IEnumerable。无论它是否直接转换为IEnumerable…当您尝试使用公共方法实现两个接口时,会出现类似于菱形问题的问题-方法名称在每个接口的上下文中可能意味着不同的内容。您也可以显式实现这些方法。这允许您为不同接口的方法提供不同的实现。通过接口访问时,总是会调用正确的方法。尽管可能是这样的情况,值得记住,但我认为这并不能回答问题。相反,我会将此作为评论发布。@Cody Gray:他想知道为什么C#不支持它。这就是我的答案。“因为他们关心你”意味着其他语言“不关心”,这是毫无意义的:)
interface IA
{
    void DoAnything(string name);
}

class A : IA
{
    public void DoSomething()
    {
        // some code
    }
    public void DoAnything(string name)
    {
        // Some code
    }
}

class B : IA
{
    public void DoNothing()
    {
        // Some code
    }

    public void DoAnything(string name)
    {
        // Some code
    }
}

class StorageCache : IA
{
    private A ObjA;
    private B ObjB;

    public void DoAnything(string name)
    {
        ObjA.DoAnything(name);
        ObjB.DoAnything(name);
    }
    public void DoNothing()
    {
        ObjB.DoNothing();
    }
    public void DoSomething()
    {
        ObjA.DoSomething();
    }
}