【发布时间】:2021-03-03 03:21:49
【问题描述】:
首先,这只是一个学术问题。我知道 C 不是做 OOP 编程的工作,但这更像是一个学习练习,让初学者了解什么是可能的,什么是不可能的(或者,什么是可能的,但不是一个好主意)。
让我们以以下为起点,我有两个不同的对象,但我想为每个对象提供相同的两种方法:create 和 print。为了简化问题,我省略了任何错误检查、释放等:
#include <stdio.h>
#include <stdlib.h>
struct Person {
char* name;
int age;
};
struct Car {
char* make;
char* model;
int year;
};
struct Person* create_person(void)
{
struct Person *new = malloc(sizeof (struct Person));
return new;
}
void print_person(struct Person* person)
{
printf("<Person: %s (%d)>\n", person->name, person->age);
}
struct Car* create_car(void)
{
struct Car *new = malloc(sizeof (struct Car));
return new;
}
void print_car(struct Car* car)
{
printf("<Car: %s - %s (%d)>\n", car->make, car->model, car->year);
}
int main(void)
{
struct Car *car = create_car();
*car = (struct Car) {.make="Chevy", .model="Eldorado", .year=2015};
print_car(car);
struct Person *person = create_person();
*person = (struct Person) {.name="Tom", .age=30};
print_person(person);
}
我认为第一部分是将“方法”分组到结构本身中。那么我们会有:
#include <stdio.h>
#include <stdlib.h>
struct Person {
char* name;
int age;
void (*print)(struct Person*);
};
struct Car {
char* make;
char* model;
int year;
void (*print)(struct Car*);
};
void print_car(struct Car* car);
void print_person(struct Person* person);
struct Person* create_person(void)
{
struct Person *new = malloc(sizeof (struct Person));
return new;
}
void print_person(struct Person* person)
{
printf("<Person: %s (%d)>\n", person->name, person->age);
}
struct Car* create_car(void)
{
struct Car *new = malloc(sizeof (struct Car));
return new;
}
void print_car(struct Car* car)
{
printf("<Car: %s - %s (%d)>\n", car->make, car->model, car->year);
}
int main(void)
{
struct Car *car = create_car();
*car = (struct Car) {.make="Chevy", .model="Eldorado", .year=2015, .print=print_car};
car->print(car);
struct Person *person = create_person();
*person = (struct Person) {.name="Tom", .age=30, .print=print_person};
person->print(person);
}
下一步如何让它“更像 OOP”?也许使用预处理器胶水和泛型?这两个对象可能成为最像 OOP 的例子是什么?再说一次,我知道这不是 C 的意义所在,但它更像是一种学习体验。
【问题讨论】:
-
David,如果你还没有找到这篇小论文,它有一个创造性的方法来使用 C 进行 OOP。恰当地标题为 Object-oriented Programming with ANSI C (Chapter 2) 我注意到第 2 章,因为那是具体细节讨论了使用的方法。有合理的继承和其他 OPP 特征。非常值得一读,看看它是否包含一些您可以使用的方法。该方法是合理的且功能强大,但实施起来有点乏味——这就是为什么 C 语言中的 OOP 不是什么大事......
-
@DavidC.Rankin 我明白了,谢谢你的链接。你读过 C 的接口 + 实现吗?我听说那本书推荐了很多 C 语言中的 OOP 概念。
-
不,我还没有看到那个,但我会查一下。我在几年前(大约 5 到 6 年)完成了所有我能找到的 OOP。而且,虽然我喜欢解决问题的简洁方法,但我总是回到这样一个现实,即对于每一个新问题,重新实现所有好的方法,通常花费的时间与编写一个量身定制的解决方案一样多。大部分都是因为 C 是强类型的。即使引入了
_Generic,似乎我最终还是会为某个问题编写另一种量身定制的方法。 (你可能会发现我错过的突破:)