当我准备面试的时候,我在网上读了一些文章,我发现了下面的声明-
编写面向对象的代码,甚至用非面向对象的语言编写?
这句话是真的吗?
如果有人在面试中问我这个问题,谁能提供一个例子来证明上述说法是正确的。
我们什么时候用非面向对象的语言编写面向对象的代码?
我主要在爪哇工作。因此,任何与此相对应的例子都是有帮助的。
提前谢谢。
发布于 2013-04-07 01:57:33
是。早期的C++编译器在使用普通C编译器编译之前将代码翻译成C。今天,瓦拉就是这样工作的。Vala基于GLib对象系统,它为C提供面向对象的特性,但显然非常麻烦。Vala简化了这个过程。
例如,以下内容大致相当于:
Person.java:
public class Person {
private String name;
private int age;
public Person(String name, int age) { /* code */ }
int getAge () {
return age;
}
String getName () {
return name;
}
void setAge (int age) {
this.age = age;
}
void setName (String name) {
this.name = name;
}
}人h:
/*
This line serves two purposes:
a. Declare the struct without revealing its attributes; this is
called an "opaque struct."
b. Let us use just `Person` instead of `struct Person` to refer to
the struct.
*/
typedef struct Person Person;
/* Constructor */
Person* person_new (const char *name, int age);
/* Destructor -- just a wrapper around free() for simple cases */
void person_free (Person *obj);
/* Other methods */
int person_get_age (const Person *obj);
const char* person_get_name (const Person *obj);
void person_set_age (Person *obj, int age);
void person_set_name (Person *obj, const char *name);个人c:
#include <stdlib.h>
#include "person.h"
/* Now we define the struct. */
struct Person
{
int age;
char *name;
};
Person* person_new (const char *name, int age)
{
Person *obj = (Person*) malloc (sizeof(Person));
obj->name = name;
obj->age = age;
return obj;
}
void person_free (Person *obj)
{
free (obj);
}
int person_get_age (const Person *obj)
{
return obj->age;
}
const char* person_get_name (const Person *obj)
{
return obj->name;
}
void person_set_age (Person *obj, int age)
{
obj->age = age;
}
void person_set_name (Person *obj, const char *name)
{
obj->name = name;
}然后使用它,您可以执行如下操作:
Person *me = person_new ("James Jensen", 27);
printf ("Hi, I'm %s and I'm %i years old.\n",
person_get_name (me),
person_get_age (me));
person_free (me);你也可以继承,但这要复杂得多,我对自己的能力不太有信心。基本方法如下所示(欢迎更正):
重要人物c:
#include <stdlib.h>
#include "person.h"
/* Please just imagine I wrote this. */
#include "importantperson.h"
struct ImportantPerson
{
Person super; /* Note that this is NOT a pointer. */
int importance;
};
ImportantPerson* importantperson_new (const char *name, int age,
int importance)
{
ImportantPerson *obj = (ImportantPerson*) malloc (sizeof(ImportantPerson));
person_set_name(&(obj->super), name);
person_set_age(&(obj->super), age);
obj->importance = importance;
return obj;
}
void importantperson_free (ImportantPerson *obj)
{
free (obj);
}
int importantperson_get_age (ImportantPerson *obj)
{
return person_get_age (&(obj->super));
}
/* ...other getters... */
void importantperson_set_age (ImportantPerson *obj, int age)
{
person_set_age (&(obj->super), age);
}
/* ...other setters... */如果我没有弄错,因为C组织数据的方式,将一个非指针Person对象作为ImportantPerson的第一个属性也允许您这样做:
ImportantPerson *me = importantperson_new ("James Jensen", 27, 9001);
/* Now I humble myself a bit... */
Person *p = (Person*) me;
printf ("Hi, my name is %s and I'm %i years old.\n",
person_get_name (p),
person_get_age (p));
/*
Now, destructors can be a bit of a problem. If they weren't both just
wrapping free(), this would do the wrong thing:
person_free (p);
*/
importantperson_free (me);我希望这能把事情弄清楚。和往常一样,我欢迎更有经验的程序员的更正。
发布于 2013-04-07 00:45:21
在任何语言中,使用类似于结构的东西都有一种很难的方法。您只需要确保在该结构中有一些局部变量和一组操作它们的函数(方法)。您可以通过指向这些函数的指针来存储函数,并且只通过给定的结构访问这些函数。在这个堆叠溢出柱中,有一本关于在ANSI中进行这种编程的广泛书籍。
Python的对象是类似的变量和函数字典。其他语言也使用这种方法,支持字典的语言也可以类似地工作。即使是那些语言,如果你知道如何用它们来制作字典,也是不可能做到的。
https://softwareengineering.stackexchange.com/questions/194154
复制相似问题