如果Class1已经实现了Interface1,则继承Class1并实现Interface1

时间:2015-11-26 06:19:06

标签: c# oop inheritance interface

首先是第一件事。我希望我的头衔不会产生误导。我尽力说出来。

现在,请参阅下面的代码。案例1非常简单。两种情况都按预期工作。我的问题是为什么编译器允许案例2?是否有特定情况需要时。我想不出一个。

interface IEmployee
{
    void Register(string role);
}

abstract class Employee : IEmployee
{
    public void Register(string role)
    {
        Console.WriteLine(role);
    }
}

// Case 1
class Manager : Employee
{
}

// Case 2
class Developer : Employee, IEmployee
{
}

class Test
{
    public void Test1()
    {
        IEmployee emp1 = new Manager();
        emp1.Register("manager"); // output "manager"

        IEmployee emp2 = new Developer();
        emp2.Register("developer"); // output "developer"
    }
}

1 个答案:

答案 0 :(得分:3)

修改

正如我所料,答案可以在c#规范中找到

一些标语:

  

13.4.5接口实现继承

     

在没有显式重新实现接口的情况下,派生类不能以任何方式改变它从其基类继承的接口映射

     

13.4.6界面重新实施

     

允许继承接口实现的类通过将其包含在基类列表中来重新实现接口

阅读更多内容以研究所有案例(可在Visual Studio文件夹中找到数字副本)

<小时/> 首先想到:案例2至少是允许的,因为接口可以明确地实现(sample)。它原来是可用选项

的子集
public interface IEmployee
{
    void Register(string role);
}

public abstract class Employee : IEmployee
{
    public void Register(string role)
    {
        Console.WriteLine(role);
    }
}

// Case 2
public class Developer : Employee, IEmployee
{
    // this will not work without IEmployee in declaration!
    void IEmployee.Register(string role)
    {
        Console.WriteLine("i'm developer!");
    }
}
public class Program
{
    public static void Main()
    {
        var dev = new Developer();
        dev.Register("senior"); 

        IEmployee e = dev;
        e.Register("senior");   
    }
}

程序打印:

senior
i'm developer!

第一个值来自Employee.Register

第二个值 - 来自Developer.Register

如果Developer定义为

// Case 2
public class Developer : Employee
{
    public void Register(string role)
    {
        Console.WriteLine("i'm developer!");
    }
}

同一程序的输出是:

i'm developer!
senior