![](/img/trans.png)
[英]Defining a property of type 'class1 : interface1' into another interface
[英]Inherit Class1 and implement Interface1 both in case Class1 already implements Interface1
首先是第一件事。 我希望我的头衔不会产生误导。 我尽力说出来。
现在,请参阅下面的代码。 案例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"
}
}
编辑
正如我所料,答案可以在c#规范中找到
一些标语:
13.4.5接口实现继承
在没有显式重新实现接口的情况下,派生类不能以任何方式改变它从其基类继承的接口映射
13.4.6接口重新实现
允许继承接口实现的类通过将其包含在基类列表中来重新实现接口
阅读更多内容以研究所有案例(可在Visual Studio文件夹中找到数字副本)
senior
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.