Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.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# - Fatal编程技术网

C# 我们什么时候需要从一个由我们从中继承的类实现的接口重新继承?

C# 我们什么时候需要从一个由我们从中继承的类实现的接口重新继承?,c#,C#,编译器不会给出任何警告。所以这让我很好奇。我们什么时候需要从一个由我们从中继承的类实现的接口重新继承 interface IFoo { void Any(); } class Foo : IFoo { public void Any() => Console.WriteLine("Foo"); } class Program : Foo, IFoo { static void Main() { IFoo ifoo = new Progra

编译器不会给出任何警告。所以这让我很好奇。我们什么时候需要从一个由我们从中继承的类实现的接口重新继承

interface IFoo
{
    void Any();
}

class Foo : IFoo
{
    public void Any() => Console.WriteLine("Foo");
}

class Program : Foo, IFoo
{
    static void Main()
    {
        IFoo ifoo = new Program();
        ifoo.Any();

        Foo foo = new Program();
        foo.Any();


        Program program = new Program();
        program.Any();
    }
}
什么时候我们需要重新继承一个已经被修改过的接口 由我们从中继承的类实现

interface IFoo
{
    void Any();
}

class Foo : IFoo
{
    public void Any() => Console.WriteLine("Foo");
}

class Program : Foo, IFoo
{
    static void Main()
    {
        IFoo ifoo = new Program();
        ifoo.Any();

        Foo foo = new Program();
        foo.Any();


        Program program = new Program();
        program.Any();
    }
}
这样做是完全有效的,然后在程序中显式地实现IFoo以获得不同的实现

例如:

using System;

interface IFoo
{
    void Any();
}

class Foo : IFoo
{
    public void Any() => Console.WriteLine("Foo");
}

class Program : Foo, IFoo
{
    static void Main()
    {
        IFoo ifoo = new Program();
        ifoo.Any();

        Foo foo = new Program();
        foo.Any();


        Program program = new Program();
        program.Any();
    }

    void IFoo.Any() => Console.WriteLine("Program");
}
这将输出:

Program
Foo
Foo

当然,这是不寻常的,很少使用。但这是一个例子,说明了为什么编译器允许类有效地重写接口实现是有帮助的。

为什么会出现错误/警告?@mjwills:类似于隐藏,编译器会警告我们。但你警告你的原因是什么?你担心什么会出错?program.Any;你确定这会打印出来吗?你能解释一下这个行为吗?第一个写程序是因为程序告诉它通过接口实现。第二个写Any,因为Foo的Any方法就是这样做的。第三个写Any,因为程序缺少Any方法,看起来它有Any方法,但实际上没有-程序的Any方法仅用于显式接口实现。好的,当您无法控制Foo类并且无法使Any方法虚拟时,它可能会很有用。但是,与Foo-Foo=新程序的结果不同;IFoo IFoo=新程序;会让开发者哭泣吗