考虑一下:
public class interface Person : IPerson { int ID { get; protected set; } string FirstName { get; set; } string LastName { get; set; } string FullName { get { return FirstName + " " + LastName; } } }
还有这个:
public class StubPerson : IPerson { int ID { get { return 0; protected set { } } string FirstName { get { return "Test" } set { } } string LastName { get { return "User" } set { } } string FullName { get { return FirstName + " " + LastName; } } }
用法:
IPerson iperson = new Person();
要么:
IPerson ipersonStub = new StubPerson();
要么:
IPerson ipersonMock = mocks.CreateMock();
所以实际上我们同时声明了IPerson接口和Person类:
public class interface Person : IPerson
你认为在.NET/C#中获得这种支持是否有用?
编辑:
由于大规模混淆,我认为我需要澄清拟议的目的:
如果没有此功能,您必须写:
interface IPerson { int ID { get; } string FirstName { get; set; } string LastName { get; set; } string FullName { get; } }
以及:
public class Person : IPerson { int ID { get; protected set; } string FirstName { get; set; } string LastName { get; set; } string FullName { get { return FirstName + " " + LastName; } } }
我根本没有提出任何语义上的改变.
让我看看我是否明白你在问什么:
为什么我们不能声明一个接口:
interface IPerson { string Name {get;set;} int ID {get;set;} }
实现该接口的类将继承其属性,而不必重新声明它们:
class Person : IPerson { } //person now has properties Name and ID
你不能这样做的原因是即使你的界面代码和你的类代码的文本非常相似,它们意味着非常不同的东西.界面只是说"实现者将有一个带有getter和setter的字符串名称".这个类说"当调用名字的getter时返回私有字段".即使您使用自动属性快捷方式让编译器实现该逻辑,它仍然是属于该类的逻辑.仅仅因为:
string Name {get;set;}
在界面和类中看起来相同,它并不意味着甚至远程相同的东西.
编译器实现任意逻辑以满足您的合同将是非常危险的,而不是在编译时抱怨您没有实现它们.它可能会引入很难追查的错误.当没有定义行为时,编译器会回退到默认行为是一个非常非常糟糕的想法.