在Java语言中,如果我们想实现继承,那我们会这样写。
比如我们要定义一个 Person
类,然后定义一个Student
类继承自Person
类,
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "I am a " + this.getClass().getSimpleName() + ", my name is " + getName() + ", " + getAge()
+ " years old";
}
}
然后定义一个Student
类继承自 Person
:
public class Student extends Person {
private String school;
public Student(String name, int age) {
super(name, age);
}
public void setSchool(String school) {
this.school = school;
}
public String getSchool() {
return school;
}
@Override
public String toString() {
return super.toString() + ", study in " + getSchool();
}
}
然后我们这样使用它们。
Person person = new Person("jerry", 27);
System.out.println(person.toString());
Student student = new Student("jerry", 27);
student.setSchool("Shanghai high school");
System.out.println(student.toString());
输出结果为:
I am a Person, my name is jerry, 27 years old
I am a Student, my name is jerry, 27 years old, study in Shanghai high school
那么我们在C语言里可以怎么去实现呢。其实我们就是在结构体里面包含一个指向”父类”的结构体指针就好了。Person 的定义
typedef struct _person{
char name[128];
int age;
void (*setName)(struct _person * person, char* name);
void (*setAge)(struct _person * pseron,int age);
char *(*getName)(struct _person * person,int *len);
int (*getAge)(struct _person * pseron);
}Person;
static void setName(struct _person * person, char* name){
if(person == NULL)
return;
memcpy(person->name, name, strlen(name));
return;
}
static void setAge(struct _person * person,int age){
if(person == NULL)
return;
person->age = age;
return;
}
static char * getName(struct _person * person, int *len){
if(person == NULL)
return NULL;
*len = strlen(person->name);
return person->name;
}
static int getAge(struct _person * person){
if(person == NULL)
return -1;
return person->age;
}
Person * Person_new(char * name, int age){
Person * person = NULL;
person = (Person *)malloc(sizeof(Person));
memset(person, 0, sizeof(Person));
person->getAge = getAge;
person->getName = getName;
person->setName = setName;
person->setAge = setAge;
memcpy(person->name, name, strlen(name));
person->age = age;
return person;
}
void Person_delete(Person * person){
if(person == NULL)
return;
free(person);
return;
}
然后是Student
typedef struct _student{
Person *person;
char school[128];
void (*setSchool)(struct _student * student, char *school);
char * (*getSchool)(struct _student * student, int *len);
void (*setName)(struct _student * student, char* name);
void (*setAge)(struct _student * student,int age);
char *(*getName)(struct _student * student,int *len);
int (*getAge)(struct _student * student);
}Student;
static void setSchool(struct _student * student, char *school){
}
static char * getSchool(struct _student * student, int *len){
return NULL;
}
static void stu_setName(struct _student * student, char* name){
if(student == NULL)
return;
student->person->setName(student->person,name);
return;
}
static void stu_setAge(struct _student * student,int age){
if(student == NULL)
return;
student->person->setAge(student->person,age);
return;
}
static char * stu_getName(struct _student * student, int *len){
if(student == NULL)
return NULL;
return student->person->getName(student->person, len);
}
static int stu_getAge(struct _student * student){
if(student == NULL)
return -1;
return student->person->getAge(student->person);
}
Student *Student_new(char * name, int age){
Student * student = NULL;
student = (Student *) malloc(sizeof(Student));
memset(student, 0, sizeof(Student));
student->person = Person_new(name, age);
student->getSchool = getSchool;
student->setSchool = setSchool;
student->getAge =stu_getAge;
student->getName = stu_getName;
student->setName = stu_setName;
student->setAge = stu_setAge;
return student;
}
void Student_delete(Student * student){
if(student == NULL)
return;
Person_delete(student->person);
free((void *)student);
return;
}
我们这样使用 Student
:
int len;
Student *student = Student_new("tom", 15);
printf("Hello, my name is %s, %d years old \n", student->getName(student, &len),student->getAge(student));
Student_delete(student);
student = NULL;
输出结果为:
Hello, my name is tom, 15 years old
这样我们就实现了Student
集成 Person
当然这里为了方便使用,而且尽量让代码比较接近我们使用的面相对象语言,在Student
中把Person
提供的方法都重写的了一遍。