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?


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.


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.


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).


À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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.