你认为"自动接口实现"在.NET/C#中会有用吗?

Jon*_*ker 5 .net c# interface automatic-properties language-enhancement

考虑一下:

public class interface Person : IPerson
{
  int ID { get; protected set; }
  string FirstName { get; set; }
  string LastName { get; set; }
  string FullName { get { return FirstName + " " + LastName; } }
}
Run Code Online (Sandbox Code Playgroud)

还有这个:

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; } }
}
Run Code Online (Sandbox Code Playgroud)

用法:

IPerson iperson = new Person();
Run Code Online (Sandbox Code Playgroud)

要么:

IPerson ipersonStub = new StubPerson();
Run Code Online (Sandbox Code Playgroud)

要么:

IPerson ipersonMock = mocks.CreateMock<IPerson>();
Run Code Online (Sandbox Code Playgroud)

所以实际上我们同时声明了IPerson接口和Person类:

public class interface Person : IPerson
Run Code Online (Sandbox Code Playgroud)

你认为在.NET/C#中获得这种支持是否有用?

编辑:

由于大规模混淆,我认为我需要澄清拟议的目的:

如果没有此功能,您必须写:

interface IPerson
{
  int ID { get; }
  string FirstName { get; set; }
  string LastName { get; set; }
  string FullName { get; }
}
Run Code Online (Sandbox Code Playgroud)

以及:

public class Person : IPerson
{
  int ID { get; protected set; }
  string FirstName { get; set; }
  string LastName { get; set; }
  string FullName { get { return FirstName + " " + LastName; } }
}
Run Code Online (Sandbox Code Playgroud)

我根本没有提出任何语义上的改变.

Rex*_*x M 11

让我看看我是否明白你在问什么:

为什么我们不能声明一个接口:

interface IPerson
{
    string Name {get;set;}
    int ID {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

实现该接口的类将继承其属性,而不必重新声明它们:

class Person : IPerson { } 
//person now has properties Name and ID
Run Code Online (Sandbox Code Playgroud)

你不能这样做的原因是即使你的界面代码和你的类代码的文本非常相似,它们意味着非常不同的东西.界面只是说"实现者将有一个带有getter和setter的字符串名称".这个类说"当调用名字的getter时返回私有字段".即使您使用自动属性快捷方式让编译器实现该逻辑,它仍然是属于该类的逻辑.仅仅因为:

string Name {get;set;}
Run Code Online (Sandbox Code Playgroud)

在界面和类中看起来相同,它并不意味着甚至远程相同的东西.

编译器实现任意逻辑以满足您的合同将是非常危险的,而不是在编译时抱怨您没有实现它们.它可能会引入很难追查的错误.当没有定义行为时,编译器会回退到默认行为是一个非常非常糟糕的想法.


Jon*_*eet 4

不久前我考虑过同样的事情,特别是在您只有一个接口的生产实现,但您想模拟它以进行测试的情况下。目前它有点像以前的 .c/.h 文件。

我怀疑最终它的好处会被语言和随后阅读代码的额外复杂性所抵消。不过,我仍然有兴趣看到它被更彻底地探索。即便如此,我的优先级列表中还有其他更高的事情 - 对不变性的更好支持位于顶部:)