[quote=Leonardo3001]dmarcosm,
olha só, como eu acho o pcalcado um entre vários aqui do GUJ que postam aqui para agregar conhecimento e não pra falar besteira, vou te mostrar o programinha em C com conceitos OO. Deu uma meia hora pra fazer.
Aqui o arquivo structs.h
#ifndef _STRUCTS_H
#define _STRUCTS_H
#include <stdlib.h>
#ifdef __cplusplus
extern "C" {
#endif
/* Atributos e métodos da Classe A */
/* Propriedades */
struct tA {
int varA;
};
/* Construtor */
void init_A(struct tA* pttA) {
pttA->varA = 0;
};
/* Getter */
int A_getVarA(struct tA* pttA) {
return pttA->varA;
};
/* Setter */
void A_setVarA(struct tA* pttA, int varA) {
pttA->varA = varA;
};
/* Destrutor */
void delete_A(struct tA** ptpttA) {
free(*ptpttA);
*ptpttA = 0;
};
/* Atributos e métodos da Classe B */
/* Propriedades */
struct tB {
struct tA super;
};
/* Construtor */
void init_B(struct tB* pttB) {
init_A(&(pttB->super));
};
/* Getters */
int B_getVarA(struct tB* pttB) {
struct tA* pttA = (struct tA*) pttB;
return pttA->varA + 1;
};
int B_getVarAAdd(struct tB* pttB, int i) {
struct tA* pttA = (struct tA*) pttB;
return pttA->varA + i;
};
/* Destrutor */
void delete_B(struct tB** ptpttB) {
free(*ptpttB);
*ptpttB = 0;
};
#ifdef __cplusplus
}
#endif
#endif
e aqui um main que usa a definição acima:
#include <stdio.h>
#include <stdlib.h>
#include "structs.h"
/*
*
*/
int main(int argc, char** argv) {
/* Vou iniciar um objetoA */
struct tA objectA;
init_A(&objectA);
/* Vou dar um get no varA no objetoA */
printf("objetoA.varA = %d\n", A_getVarA(&objectA));
/* Vou setar o objetoA */
A_setVarA(&objectA, 17);
printf("objetoA.varA = %d\n", A_getVarA(&objectA));
/* Vou criar um objetoB */
struct tB objectB;
init_B(&objectB);
/* Como um objetoB é um objetoA, vou chamar o setter da superclasse */
A_setVarA((struct tA*)&objectB, 43);
/* Vou chamar o getter do objetoB, lembre-se que adiciona 1 */
printf("objetoB.varA = %d\n", B_getVarA(&objectB));
/* Vou chamar o segundo getter do objetoB */
printf("objetoB.varA(12) = %d\n", B_getVarAAdd(&objectB, 12));
/* Vou atribuir o objetoB a uma referência ao objetoA */
struct tA* referenceA = &objectB;
/* vou chamar o getter do objeto A */
printf("referenceA.varA = %d\n", A_getVarA(referenceA));
return (0);
}
Por favor, não se prenda a sintaxe. Repare que existe polimorfismo, herança e encapsulamento (ainda que getter e setter é um jeito porco de encapsular) como um paradigma orientado a objetos deve ter.
E aí, ainda acha que é impossível fazer isso em C?[/quote]
Caracas… acho q vocês não estão lendo o que eu escrevi. NUNCA disse que é impossível, NUNCA disse que não dá pra fazer e NUNCA disse que não se pode fazer.
A ÚNICA coisa que eu disse é que, o que as pessoas fazem para ter um resultado parecido em uma linguagem não OO é um gato, ou se preferirem, um Workaround! Ainda mais… disse que este é o meu ponto de vista. Isto é igual a discussão do ovo e da galinha!!!
Você disse que gastou 30 minutos pra fazer aquele exemplo idiota que eu gastei 2 minutos. E ainda por cima nem usei uma IDE, escrevi direto no editor aqui do fórum!!! É exatamente por isto que eu falo que é um gato. Não é nativo. Não é da linguagem.
Agora vai implementar só as entidades do projeto do qual eu participo. São 95 classes só na camada de entidade!!! Fora a camada de persistência, negócio e apresentação. Sem contar as classes utilitárias DAOs e Formatadores! Se agente gastar 1 ano para desenvolver isto em Java, vocês gastariam 15 para desenvolver em C ansi orientado a objetos, certo?
Teoria != Prática
Ps.: Pcalçado, sim! Eu lí os links que você passou.
E…
- Stroustrup desenvolveu o C++ (o C ansi foi desenvolvido pelo Ritchie). Ele achava que C não era suficiente para implementar OO eficientemente! =] Ele criou o “C with classes” que inicialmente agregava o conceito de classes ao C (por isto o nome). Posteriormente, com a adição de novos recursos, o nome foi alterado para C++.
- Smalltalk 80 é completamente OO. O 72 por exemplo ainda não implementava muito bem estes conceitos não.
- Sobre Martin Fowler, tenho que admitir que não li todos os livros dele, mas acredito que quando por ventura ele resolve usar um exemplo de OO, não usa C ansi!!!
- Quanto aos outros, bem… acho que eles quiseram desenvolver linguagens OO, porque as não OO não eram muito úteis para este fim!!!
- Ah… e o Hejlsberg desenvolveu o C# baseado, olhem só, em Java e C++!!!
- Já o Delphi utiliza uma linguagem chamada “Object Pascal” que, a pesar de ser baseada, não é o mesmo que Pascal. Esta sim, é orientada a objetos.
Quanto aos links… bem… acho que é só você dar uma pausa para reler aquilo que você já leu!