Por que o C # permite propriedades em interfaces?

47

Em C #, o código a seguir é válido

interface I{
    int property{get;set;}
}

O que não faz nenhum sentido para mim. Isso parece quebrar um dos princípios mais importantes das interfaces: falta de estado (em outras palavras, nenhum campo). A propriedade não cria um campo privado implícito? Isso não seria realmente ruim para interfaces?

Restabelecer Monica
fonte
12
A falta de estado é um dos princípios de uma implementação de interface ? Para mim, uma interface é uma maneira de definir um contrato, ou seja, se uma classe implementa essa interface, ela possui todos os métodos e propriedades definidos no contrato.
Florian Margaine
4
Uma propriedade é apenas um método get e um método set. Como as interfaces são apenas uma lista de métodos que você precisa implementar, é natural que as interfaces possam tê-los.
Doval 23/07
1
@FlorianMargaine Certamente o conceito de contrato é o princípio mais importante das interfaces, mas a falta de estado também é importante. Isso ajuda a mantê-lo separado de uma classe abstrata. O IE no Java 8 acaba sendo a única grande diferença entre interfaces e classes abstratas.
Reponha Monica em
2
Porque não é um campo. Consulte Por que as interfaces C # não podem conter campos?
2
@Doval: É natural que uma interface declare tais métodos, mas não que os implemente.
Giorgio

Respostas:

65

Acho que a parte confusa é que, se você escreve int Property { get; set; }dentro de uma classe, é uma propriedade automática com um campo implícito de apoio.

Mas se você escrever exatamente a mesma coisa em uma interface, não é propriedade automática , apenas declara que a propriedade faz parte da interface e que qualquer tipo que implemente a interface deve conter essa propriedade (como propriedade automática ou não ), mas não cria o campo de apoio.

Uma maneira de ver a diferença é escrever int Property { get; }: isso é válido em uma interface e declara uma propriedade que possui apenas um getter, mas nenhum setter. Mas não será compilado em uma classe (a menos que você esteja usando o C # 6.0), porque a propriedade automática precisa ter um setter.

svick
fonte
18

Definir a propriedade como você mostrou é o mesmo que definir métodos int GetProperty()e void SetProperty(int i). As propriedades são poderosas em atalho em C #.

Uma propriedade não cria implicitamente um campo privado em C #. Essa é a implementação padrão de auto-property, por exemplo public string MyString { get; set;}- uma propriedade que define a lógica personalizada no getmétodo não gera um campo privado implícito.

Por fim, como as interfaces estão preocupadas com a API pública , o que importaria se a implementação de uma propriedade de interface dependesse de um campo privado - implícito ou não? Isso está oculto para os consumidores da interface, independentemente.

NWard
fonte
Ahh ... eu não percebi que isso só acontece com propriedades automáticas e, como você precisa substituí-lo, isso faz sentido. Mas se a interface fosse criar uma variável privada interna, os implementadores não teriam acesso a ela - um problema óbvio.
Reintegrar Monica
9
Se você definir uma propriedade em uma interface C #, a implementação dessa propriedade é deixada para a classe de implementação - eles podem transformá-la em uma propriedade automática ou definir uma lógica customizada como entenderem. Nenhum campo é adicionado à interface .
NWard 23/07
10

Propriedades são métodos! Um campo de apoio será adicionado à classe que implementa a interface (manualmente ou através de uma propriedade automática).

Roman Reiner
fonte
Às vezes, não haverá campo de apoio. Embora seja raro definir um get e um conjunto e não ter um campo de suporte para ele.
Stephen
+1 Propriedades são métodos! sim! Eu gosto de escrever métodos de propriedade, mas os colegas de revisão de código não vêem dessa maneira e realmente perdemos oportunidades para alguns encapsulamentos expressivos agradáveis ​​em nossos programas.
Radarbob
Esses "métodos de propriedade" devem ser rápidos, como nenhuma pesquisa de banco de dados ou algo assim. Há um contrato implícito de que o acesso à propriedade é rápido, os métodos Get * podem ser lentos.
Trey Mack