Nik*_*tak 6 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"
}
}
Run Code Online (Sandbox Code Playgroud)
编辑
正如我所期望的,答案可以在 C# 规范中找到
一些标语:
13.4.5 接口实现继承
如果不显式地重新实现接口,派生类就无法以任何方式更改它从基类继承的接口映射
13.4.6 接口重新实现
继承接口实现的类可以通过将其包含在基类列表中来重新实现该接口
阅读更多内容以研究所有案例(可以在 Visual Studio 文件夹中找到数字副本)
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!");
}
}
Run Code Online (Sandbox Code Playgroud)
public class Program
{
public static void Main()
{
var dev = new Developer();
dev.Register("senior");
IEmployee e = dev;
e.Register("senior");
}
}
Run Code Online (Sandbox Code Playgroud)
程序打印:
senior
i'm developer!
Run Code Online (Sandbox Code Playgroud)
第一个值来自Employee.Register
第二个值 - 来自Developer.Register
如果Developer定义为
// Case 2
public class Developer : Employee
{
public void Register(string role)
{
Console.WriteLine("i'm developer!");
}
}
Run Code Online (Sandbox Code Playgroud)
同一程序的输出是:
i'm developer!
senior
Run Code Online (Sandbox Code Playgroud)