Beruflich Dokumente
Kultur Dokumente
JY = SchoolMember().init(“JY”, Date(“1970-09-21”))
print(JY.age())
JY.greet()
Problems of Pure Abstract Data Types
All ADTs are independent and at the same level
Can we define new types in terms of existing ones?
Can we treat hierarchically structured types as
compatible ones?
Can we redefine operations while keeping the
interface intact?
Teacher and Student Example
Teacher Student
name, birthdate, lecture name, birthdate, id_no
name, age, teaches, name, age, ID_no,
greet greet
Teacher and Student in “C” (V1)
typedef struct { typedef struct {
char name[NAMELEN]; char name[NAMELEN];
Date birthdate; Date birthdate;
char lecture[NAMELEN]; int id_no;
} Teacher; } Student;
Teacher newTeacher(char *name, Student newStudent(char *name,
Date birthdate, char *teaches) { Date birthdate, int id_no) {
Teacher teacher; Student student;
strcpy(teacher.name, name); strcpy(student.name, name);
teacher.birthdate = birthdate; student.birthdate = birthdate;
strcpy(teacher.lecture, teaches); student.id_no = id_no;
return teacher; return student;
} }
int Teacher_Age(Teacher teacher) { int Student_Age(Student student) {
return Now().year – return Now().year – student.birthdate.year;
teacher.birthdate.year; }
} char *Student_Greet(Student student) {
char *Teacher_Greet(Teacher teacher) { char *buf = (char *)malloc(BUFSIZ);
char *buf = (char *)malloc(BUFSIZ); sprintf(buf, "Name: %s, Age: %d, ID_no: %d",
sprintf(buf, "Name: %s, Age: %d, student.name, Student_Age(student),
Teaches: %s", student.id_no);
teacher.name, return buf;
Teacher_Age(teacher), }
teacher.lecture);
return buf;
}
Teacher and Student (Cont’d)
Teacher Student
name, birthdate, lecture name, birthdate, id_no
name, age, teaches, name, age, ID_no,
greet greet
Member
name, birthdate
name, age, greet
Teacher Student
lecture id_no
teaches, greet ID_no, greet
Visiting
valid_thru
expired, greet
Object-Oriented Languages
Simula 67
Smalltalk
Oberon-2
C++ (C syntax, Simula 67 spirit)
Java (C++ syntax, Smalltalk spirit)
C#
Objective-C (C + Smalltalk)
Python
Ruby
Go (Resurrected Oberon-2)
…
Teacher, Student & Visiting in “C++”
class Member { class Teacher: public Member {
public: public:
string Name(); Teacher(string name, Date birthdate,
int Age(); string teaches);
virtual string Greet(); String Teaches();
protected: string Greet();
Member(string name, Date birthdate); private:
private: string lecture;
string name; };
Date birthdate; Teacher::Teacher(string name, Date birthdate,
}; string teaches): Member(name, birthdate) {
Member::Member(string name, this->lecture = teaches;
Date birthdate) { }
this->name = name; string Teacher::Teaches() {
this->birthdate = birthdate; return this->lecture;
} }
string Member::Name() {
return this->name; string Teacher::Greet() {
} return Member::Greet() + ", Teaches: " +
int Member::Age() { this->Teaches();
return Now().GetYear() – }
this->birthdate.GetYear();
} class Student: public Member {…}
string Member::Greet() {
return "Name: " + Name() + ", Age: " + class Visiting: public Student {…}
std::to_string(Age());
}
Teacher, Student & Visiting in “C++”
bool ageComp(Member *m1, Member *m2) {
return m1->Age() < m2->Age();
}
int main(int argc, char *argv[]) {
list<Member*> members;
members.push_back(new Teacher(…));
members.push_back(new Student(…));
members.push_back(new Visiting(…));
members.sort(ageComp);
cout << "Members sorted on age..." << endl;
for (it = members.begin(); it != members.end(); ++it)
cout << ((Member *)(*it))->Greet() << endl;
cout << endl;
return 0;
}
Rethinking Teacher, Student & Visiting
IMember
name, age, greet
Member
name, birthdate
name, age, greet
Teacher Student
lecture id_no
teaches, greet ID_no, greet
Visiting
valid_thru
expired, greet
Teacher, Student & Visiting in “Java”
interface IMember { class Teacher extends Member {
public String name(); public Teacher(String name,
public int age(); LocalDate birthdate,
public String greet(); String teaches) {
} super(name, birthdate);
this.lecture = teaches;
class Member implements IMember { }
protected Member(String name, public string teaches() {
LocalDate birthdate) { return this.lecture;
this.name = name; }
this.birthdate = birthdate;
} public String greet() {
return super.greet() +
public final String name() { ", Salary: " + salary();
return this.name; }
}
private String lecture;
public final int age() { }
return LocalDate.now().getYear() -
birthdate.getYear(); class Student extends Member {…}
}
public String greet() { class Visiting extends Student {…}
return "Name: " + this.name() +
", Age: " + this.age();
}
private String name;
private LocalDate birthdate;
}
Teacher, Student & Visiting in “Java”
class AgeSorter implements Comparator<IMember> {
public int compare(IMember m1, IMember m2) {
return m1.age() - m2.age();
}
}
Line Circle
extent radius
extent, change_extent, radius, change_radius,
length, draw draw
FilledCircle
draw