首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用非面向对象语言编写面向对象的代码

用非面向对象语言编写面向对象的代码
EN

Software Engineering用户
提问于 2013-04-07 00:26:31
回答 2查看 693关注 0票数 2

当我准备面试的时候,我在网上读了一些文章,我发现了下面的声明-

编写面向对象的代码,甚至用非面向对象的语言编写?

这句话是真的吗?

如果有人在面试中问我这个问题,谁能提供一个例子来证明上述说法是正确的。

我们什么时候用非面向对象的语言编写面向对象的代码?

我主要在爪哇工作。因此,任何与此相对应的例子都是有帮助的。

提前谢谢。

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2013-04-07 01:57:33

是。早期的C++编译器在使用普通C编译器编译之前将代码翻译成C。今天,瓦拉就是这样工作的。Vala基于GLib对象系统,它为C提供面向对象的特性,但显然非常麻烦。Vala简化了这个过程。

例如,以下内容大致相当于:

Java:

Person.java:

代码语言:javascript
复制
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;
    }
}

C:

人h:

代码语言:javascript
复制
/*
    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:

代码语言:javascript
复制
#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;
}

然后使用它,您可以执行如下操作:

代码语言:javascript
复制
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:

代码语言:javascript
复制
#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的第一个属性也允许您这样做:

代码语言:javascript
复制
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);

我希望这能把事情弄清楚。和往常一样,我欢迎更有经验的程序员的更正。

票数 8
EN

Software Engineering用户

发布于 2013-04-07 00:45:21

在任何语言中,使用类似于结构的东西都有一种很难的方法。您只需要确保在该结构中有一些局部变量和一组操作它们的函数(方法)。您可以通过指向这些函数的指针来存储函数,并且只通过给定的结构访问这些函数。在这个堆叠溢出柱中,有一本关于在ANSI中进行这种编程的广泛书籍。

Python的对象是类似的变量和函数字典。其他语言也使用这种方法,支持字典的语言也可以类似地工作。即使是那些语言,如果你知道如何用它们来制作字典,也是不可能做到的。

票数 5
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/194154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档