Ir para o conteúdo
pikax

Interfaces

Mensagens Recomendadas

pikax

Estou aqui a ver(e a compreender) o código de um dos meus livros e vi lá uma interface:

/**
* iGameObject
* This is the interface that allows the game to work.
* each class in the game that is of any concern to the
* networking components must implement this interface.
* It allows the network client to get and set the unique
* ID for each object (That way, two instances of an object,
* on two different machines, can talk to each other, by
* sending messages.
* Messages are sent to an object using the ProcMsg call.
* in code this breaks down to a large switch statement,
* with a case for every type of message the class can
* deal with.
*/
typedef UINT msgRet;

interface iGameObject
{
public:
virtual objID GetID() = 0;
virtual void SetID( objID id ) = 0;

virtual msgRet ProcMsg( const sMsg& msg ) = 0;
};

A minha dúvida não é não perceber o código, mas sim saber o que são interfaces, tive a ver nos outros livros e não encontrei nada, estranhei de não falar nada no The C++ Programming Language, tive a ver as keywords, mesmo assim não tinha lá interfaces.

Alguém pode indicar algum sitio que diga o que é ou que explique, gostava de saber o que era.


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
KTachyon

Uma interface é suposto ser uma base abstracta para a construção de subclasses. Ou seja, imaginando que tinhas um interface I, tu nunca vais instanciar um objecto de I, apenas irás instanciar objectos de subclasses dessa classe.

A utilidade é, teres uma lista de objectos instanciados de várias subclasses desse interface que têm a sua própria implementação dos métodos dessa interface (override). Dessa forma, qualquer um desses objectos vai responder a uma chamada de qualquer desses métodos à sua maneira.

Penso que a declaração de um interface é igual à de uma classe em C++, mas com a declaração dos métodos (a que queres fazer override nas subclasses) com a keyword 'virtual', como estás a fazer no código que mostraste. A keyword interface é que tem que ser substituída por class.

EDIT:

Tens aqui um exemplo:

http://en.wikipedia.org/wiki/Virtual_function

Só mais um ponto, para tentar tirar um pouco de ambiguidade à definição de interface... ou então ainda aumentar mais a ambiguidade :)

É bastante comum chamar-se interface à (pura) definição de uma classe (com as variáveis e declaração de métodos/funções). Quem programa para iOS, por exemplo, quando está a criar um controlador, ou a criar uma classe para um novo objecto em Objective-C, está habituado às keywords @interface e @implementation (esta para a definição).

No fundo um interface é a forma que existe de dar a conhecer que métodos é que um determinado objecto tem, e por isso é que estes são normalmente colocados em ficheiros .h (header files) e que depois são incluídos nos .cpp, .m, .*** de outras classes. No fundo servem para dar a conhecer o "interface" que objectos dessa classe, ou mesmo essa classe vai ter, para que estes saibam como é permitido comunicar com estes.

Penso que um exemplo que representa esse "interface" é a própria keyword em Java, que, basicamente é uma estrutura para se criar uma classe. Se bem que também existe a abstract class em Java, que é quase o mesmo, mas já pode implicar que alguns métodos da classe estejam implementados, enquanto que outros têm que ser efectivamente implementados pelas subclasses que serão depois instanciadas.

Existe outra palavra que costuma definir melhor essa definição de "interface" que penso que seja o que te queiram ensinar nessa secção do livro, que é a palavra "Protocol", que é comum em programação de iOS, também, e que é a palavra que é utilizada pela wikipedia para descrever esta utilidade.

Basicamente, um "Protocol", como a própria palavra indica, é um protocolo que determinadas classes têm para implementar, de forma a que o objecto seja considerado compatível (com esse protocolo). No fundo, esse teu pretende ser um protocolo, pois todas as subclasses derivadas desse "interface" devem mesmo implementar esses métodos de forma a que possam ser chamados e obter um resultado específico de cada subclasse. Podes aprofundar um pouco mais se leres:

http://en.wikipedia.org/wiki/Interface_(object-oriented_programming)  (repara como a wikipedia te redirecciona automaticamente para um artigo com um título diferente)


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pikax

mas basicamente poderia-se criar um class com metodos puramente virtuais que iria fazer o mesmo pelo o que percebi.

#include <iostream>

using namespace std;

class object
{	
public:
static int m_id;
virtual void draw() = 0;
};
int object::m_id=0;

class tipo1 : public object
{
public:
tipo1(){m_id++;}
void draw()
{
	cout<<" tipo1 - "<<m_id<<endl;
}
};

class tipo2 : public object
{
public:
tipo2(){m_id++;}
void draw()
{
	cout<<" tipo2 - "<<m_id<<endl;
}
};

void mostra(object *obj)
{
obj->draw();
}

int main()
{
object *var;

var=new tipo1;
mostra(var);
delete var;

var= new tipo2;
mostra(var);
delete var;

var=new tipo1;
mostra(var);
delete var;

cin.get();

}

pelo o que tu explicaste dava para fazer isso com uma class abstrato como eu fiz em cima(não é 100%), mas penso q dava para fazer um class 100% abstrata, mas este código ja fiz a algum tempo, para gerir varios objectos diferentes, mas ainda não pôs em pratica, agora simplifiquei muito a função mostrar, porque dantes tinha dynamic_cast e static cast.

Mas pelo o que percebi uma interface é algo assim.

Já agora tive a procurar mais um bocado e verifiquei que não é standart esta keyword, é só para o VS :S

EDIT:

Penso que um exemplo que representa esse "interface" é a própria keyword em Java, que, basicamente é uma estrutura para se criar uma classe. Se bem que também existe a abstract class em Java, que é quase o mesmo, mas já pode implicar que alguns métodos da classe estejam implementados, enquanto que outros têm que ser efectivamente implementados pelas subclasses que serão depois instanciadas.

Ainda não tive paciência nem tempo para aprender java.

Existe outra palavra que costuma definir melhor essa definição de "interface" que penso que seja o que te queiram ensinar nessa secção do livro, que é a palavra "Protocol", que é comum em programação de iOS, também, e que é a palavra que é utilizada pela wikipedia para descrever esta utilidade.

Já sei o que o que é, aqui no livro ele fala em COM(Component Model Object), já sei mais ou menos o que é. Não encontrei antes porque estava num sitio que não esperava, quase no inicio  :rant_01:

Pelo o nome de interface não conhecia, e nunca trabalhei em C++.

Vou ter que reler isto e fazer uma pesquisa no google  :)

Obrigado pela a explicação

Já agora, se uma interface é baseada em funções virtuais, então não foge muito ao que fiz em cima?  :hmm:


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
KFBoom

Já usei interfaces tanto em C++ como em C#.

Em C# uma interface serve para "obrigar" classes suas derivadas a implementar os métodos nessa interface.

Exemplificando isto em C++:

IProcessor.h

class IProcessor
{
public:
virtual void Process(int my_param)=0;
};

ClassB.h

class CClassB : public IProcessor
{
public:
CClassB(void);

~CClassB(void);
};

O meu ficheiro main:

int _tmain(int argc, _TCHAR* argv[])
{
CClassB b;
return 0;
}

Resultado da compilação:

'CClass B': cannot instantiate abstract class (aponta-me para o meu ficheiro main, linha "CClassB b;")

Se se definir esta função na minha CClassB:

void CClassB::Process(int my_param)
{
printf("I'm CClassB. Processing: '%d'\n", my_param);
}

já não dará erros de compilação.

Eu uso para, através do interface, conseguir aceder a classes suas derivadas sem precisar de as conhecer.

Passo a exemplificar (continuando o exemplo de cima):

CClassA.h

class CClassA
{
public:
(...)

void SetProcessor(IProcessor* pProcessor);

void CallIProcessor(int x);

private:
IProcessor* m_pMyProcessor;
};

ClassA.cpp

void CClassA::SetProcessor(IProcessor* pProcessor) {
m_pMyProcessor = pProcessor;
}

void CClassA::CallIProcessor(int x)
{
m_pMyProcessor->Process(x);
}

E agora o meu ficheiro main:

int _tmain(int argc, _TCHAR* argv[])
{
CClassB b;
CClassA a;

a.SetProcessor(&b);
a.CallIProcessor(5);

return 0;
}

O resultado vai ser => I'm CClassB. Processing: '5'

Basicamente, a class CClassA conseguiu aceder a um objecto da CClassB através da interface (ou classe abstracta) IProcessor.

Isto é particularmente interessante para conseguires criar programas que façam load de dll's em runtime (aka, plugins). Para o teu código só necessitas de usar a class abstracta (ou interface), que terá que também ser usado no código de criação das dlls. Essa classe abstracta/interface será o ponto de comunicação entre o programa principal e os plugins.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.