Qual é a definição de" interface " na programação orientada a objetos
Qual é a melhor descrição de uma "interface".
Para mim, uma interface é um modelo de uma classe, esta é a melhor definição?16 answers
Uma interface é um dos termos mais sobrecarregados e confusos no desenvolvimento.
É na verdade um conceito de abstração e encapsulação. Para uma dada "caixa", declara As "Entradas" e "Saídas" dessa caixa. No mundo do software, isso geralmente significa as operações que podem ser invocadas na caixa (juntamente com argumentos) e, em alguns casos, os tipos de retorno dessas operações.O que não faz é que não define o que a semântica destes as operações são, embora seja comum (e muito boa prática) documentá-las em proximidade com a declaração (por exemplo, através de comentários), ou para escolher boas Convenções de nomenclatura. No entanto, não há garantias de que estas intenções sejam seguidas.
Aqui está uma analogia: dê uma olhada em sua televisão quando ela está desligada. Sua interface são os botões que tem, as várias tomadas, e a tela. Sua semântica e comportamento são que ele toma entradas (por exemplo, programação de cabo) e tem Saídas (visualização no ecrã, som, etc.). No entanto, quando você olha para uma TV que não está conectada, você está projetando sua semântica esperada em uma interface. Tanto quanto sabes, a televisão pode explodir quando a ligares. No entanto, com base em sua "interface" você pode assumir que não vai fazer qualquer café, uma vez que não tem uma ingestão de água.Na programação orientada a objectos, uma interface define geralmente o conjunto de métodos (ou mensagens) que uma instância de uma classe que tem a interface pode responder.
O que acrescenta à confusão é que em algumas linguagens, como Java, há uma interface real com a sua semântica específica da linguagem. Em Java, por exemplo, é um conjunto de declarações de métodos, sem implementação, mas uma interface também corresponde a um tipo e obedece várias regras de Digitação.
Noutras línguas, como o C++, não tem interfaces. Uma classe em si define métodos, mas você poderia pensar na interface da classe como o declarações dos métodos não privados. Por causa de como o c++ compila, você obtém arquivos de cabeçalho onde você poderia ter a "interface" da classe sem implementação real. Você também pode imitar interfaces Java com classes abstratas com funções virtuais puras, etc.
Uma interface não é certamente um modelo para uma aula. Um projecto, por uma definição, é um "plano de Acção pormenorizado". Uma interface não promete nada sobre uma ação! A fonte da confusão é que na maioria linguagens, se você tem um tipo de interface que define um conjunto de métodos, a classe que implementa "repete" os mesmos métodos (mas fornece definição), de modo que a interface se parece com um esqueleto ou um contorno da classe.Considere a seguinte situação:
estás no meio de uma sala grande e vazia, quando um zombie te ataca de repente.
não tens arma.
felizmente, um homem vivo está à porta da sala.
"Rápido!"grita com ele. "Atira-me algo com que possa bater no zombie!"
Agora considere:
Você não especificou (nem se importa) exatamente o que o teu amigo vai escolher atirar.
...Mas não importa, desde que:
É algo que pode ser atirado (ele não pode atirar-te o sofá))
É algo que você pode agarrar (vamos esperar que ele não atirou um shuriken)
É algo que você pode usar para esmagar o cérebro do zumbi (que exclui almofadas e Tal)
Para resumir:
Quando se escreve uma interface, está-se basicamente a dizer: "Preciso de algo assim..."Interface é um contrato que você deve cumprir ou dar, dependendo se você é implementador ou um usuário.
Uma interface define como você pode interagir com uma classe, ou seja, que métodos suporta.
Para mim, uma interface é um modelo de uma classe, esta é a melhor definição?Não. Uma planta normalmente inclui os internos. Mas uma interface é puramente sobre o que é visível no exterior de uma classe ... ou mais precisamente, uma família de classes que implementam a interface. A interface consiste na assinatura de métodos e valores de constantes, e também um "contrato comportamental" (tipicamente informal) entre classes que implementam a interface e outros que o usam.
Na programação, uma interface define o comportamento que um objecto terá, mas não especificará o comportamento. É um contrato, que vai garantir, que uma determinada classe pode fazer alguma coisa.
Considere este pedaço de código C# aqui:
using System;
public interface IGenerate
{
int Generate();
}
// Dependencies
public class KnownNumber : IGenerate
{
public int Generate()
{
return 5;
}
}
public class SecretNumber : IGenerate
{
public int Generate()
{
return new Random().Next(0, 10);
}
}
// What you care about
class Game
{
public Game(IGenerate generator)
{
Console.WriteLine(generator.Generate())
}
}
new Game(new SecretNumber());
new Game(new KnownNumber());
A classe de jogo precisa de um número secreto. Por causa de testá-lo, você gostaria de injetar o que será usado como um número secreto (este princípio é chamado de inversão de controle).
A classe de jogo quer para ser " de mente aberta "sobre o que realmente irá criar o número aleatório, portanto, ele vai pedir em seu construtor para"qualquer coisa, que tem um método de Geração".
Primeiro, a interface especifica, quais as operações que um objecto irá fornecer. Contém apenas o seu aspecto, mas não é dada qualquer aplicação concreta. Isto é apenas a assinatura do método. Convencionalmente, em interfaces c# são prefixadas com um I.
As classes agora implementam a Interface IGenerate. Isto significa que o compilador certificar-se-á de que ambos têm um método, que devolve um int e é chamado Generate
.
O jogo agora está sendo chamado de dois objetos diferentes, cada um dos quais implementando a interface correta. Outras classes produziriam um erro ao construir o código.
import random
# Dependencies
class KnownNumber(object):
def generate(self):
return 5
class SecretNumber(object):
def generate(self):
return random.randint(0,10)
# What you care about
class SecretGame(object):
def __init__(self, number_generator):
number = number_generator.generate()
print number
Aqui, nenhuma das classes implementa uma interface. Python não se importa com isso, porque a classe SecretGame
vai apenas tentar chamar qualquer objeto que seja passado. Se o objeto tem um método gerar (), tudo está bem. Se não, KAPUTT!
Este erro não será visto no tempo de compilação, mas no tempo de execução, portanto, possivelmente quando o seu programa já está implantado e em execução. O c# notificava-te muito antes de te aproximares disso.
A razão este mecanismo é usado, ingenuamente afirmado, porque em OO línguas naturalmente funções não são cidadãos de primeira classe. Como você pode ver, KnownNumber
e SecretNumber
contêm apenas as funções para gerar um número. Não se precisa realmente das aulas. Em Python, portanto, pode-se simplesmente jogá-los fora e escolher as funções por conta própria:
# OO Approach
SecretGame(SecretNumber())
SecretGame(KnownNumber())
# Functional Approach
# Dependencies
class SecretGame(object):
def __init__(self, generate):
number = generate()
print number
SecretGame(lambda: random.randint(0,10))
SecretGame(lambda: 5)
[9]um lambda é apenas uma função, que foi declarada "em linha, como você vai".
Um delegado é o mesmo em C#:
class Game
{
public Game(Func<int> generate)
{
Console.WriteLine(generate())
}
}
new Game(() => 5);
new Game(() => new Random().Next(0, 10));
Os últimos exemplos não são possíveis assim em Java, Uma vez que Java não pode rodar com funções como as outras duas (Python e C#) podem. Lá, as Interfaces são a única maneira de speficiying comportamento desta forma na av.
Interface é "que trabalho" um método não"como". É um contrato. Como na fila de prioridades, você sabe o que fazer com ele, mas a implementação subjacente você não sabe. A classe concorda em nunca alterar os "efeitos" das operações existentes, e o Cliente concorda em utilizar o class strictly on the basis of its interface and to ignore any implementation informacao.
Leigo eg.: Pense em ter um controle remoto universal que possa controlar qualquer televisão, se é um velho modelo de tubo ou um que usa um ecrã LCD ou plasma. Pressiona 2, depois 5, depois entra, e qualquer um dos ecrãs irá mostrar o canal 25., mesmo que o mecanismo para fazer isso acontecer é muito diferente dependendo sobre a tecnologia subjacente.
Uma interface separa as operações numa classe das operações internas. Assim, algumas implementações podem fornecer muitas interfaces.
As pessoas costumam descrevê-lo como um "contrato" para o que deve estar disponível nos métodos da classe. Não se trata, de modo algum, de um projecto, uma vez que isso também determinaria a implementação. Uma definição de classe completa pode ser considerada como um modelo.Uma interface define o que uma classe que herda dela deve implementar. Desta forma, várias classes podem herdar de uma interface, e por causa dessa hereditariedade, você pode
- certifique-se de que todos os membros da interface são implementados na classe derivada (mesmo que seja apenas para lançar uma excepção)
- abstrair a classe em si do chamador (lançar uma instância de uma classe para a interface, e interagir com ela sem precisar de saber o que o derivado real classe IS)
Para mais informações, veja este http://msdn.microsoft.com/en-us/library/ms173156.aspx
Na minha opinião, interface tem um significado mais amplo do que o comumente associado a ele em Java. Eu definiria "interface" como um conjunto de operações disponíveis com alguma funcionalidade comum, que permitem controlar/monitorar um módulo.
Nesta definição eu tento cobrir ambas as interfaces programáticas, onde o cliente é algum módulo, e interfaces humanas (GUI, por exemplo).
Como outros já disseram, uma interface tem sempre algum contrato por trás, em termos de entradas e Saídas. A interface não promete nada sobre o "como" das operações; ela só garante algumas propriedades do resultado, dado o estado atual, a operação selecionada e seus parâmetros.Tal como acima, os sinónimos de "contrato" e "protocolo" são adequados.
A interface compreende os métodos e propriedades que você pode esperar para ser exposto por uma classe.
Por isso, se uma classe Cheetos Bag
implementa a interface Chip Bag
, deve esperar que um Cheetos Bag
se comporte exactamente como qualquer outro Chip Bag
. (Isto é, expor o método .attemptToOpenWithoutSpillingEverywhere()
, etc.)
Uma fronteira através da qual dois sistemas comunicam.
As Interfaces são a forma como algumas línguas OO conseguempolimorfismo ad hoc . Polimorfismo ad hoc é simplesmente funções com os mesmos nomes operando em diferentes tipos.
Definição convencional-uma interface é um contrato que especifica os métodos que precisam ser implementados pela classe que a executa.
A definição de Interface mudou ao longo do tempo. Você acha que Interface só tem declarações de método apenas ? E as variáveis finais estáticas e as definições padrão depois do Java 5.
Interfaces foram introduzidas em Java por causa do problema do diamante com herança múltipla e é isso que eles realmente pretendem tarefa.As Interfaces são as construções que foram criadas para se livrar do problema da herança múltipla e podem ter métodos abstratos , definições padrão e variáveis finais estáticas.