#!/usr/bin/env rdmd
import std;
interface Person {
public string name(); //待实现,抽象属性方法,.待实现,抽象属性方法,实际字段不包含普通方法
public string addr(); //
}
class PersonImpl : Person {
//仅在`数据实现类`中定义`字段和属性`方法
string _name;
string _addr;
override public string name() { return _name; }
override public string addr() { return _addr; }
}
interface Faculty : Person {
string lab(); //新的语义赋值属性,普通方法
void doBenchwork(); //
}
//由`FacultyImpl`和`ResearchAssistantImpl`重用的代码
mixin template FacultyM(bool withOverriddenProperty) {
static if (withOverriddenProperty) {
override string lab() {return addr();} //新的语义赋值属性
}
override void doBenchwork() {
writeln(name() ~ " doBenchwork in the " ~ lab());
}
}
class FacultyImpl : PersonImpl, Faculty {
//不需要新东西,所以只是继承了`PersonImpl`.
mixin FacultyM!(true);
}
interface Student : Person {
string dorm(); //新的语义赋值属性,普通方法
void takeRest(); //
}
//由`StudentImpl`和`ResearchAssistantImpl`重用代码
mixin template StudentM(bool withOverriddenProperty) {
static if (withOverriddenProperty) {
override string dorm() {return addr();} //新的语义赋值属性
}
override void takeRest() {
writeln(name() ~ " takeRest in the " ~ dorm());
}
}
class StudentImpl : PersonImpl, Student {
//不需要新东西,所以只是扩展了`PersonImpl`.
mixin StudentM!(true);
}
interface ResearchAssistant : Student, Faculty {
//工厂方法
static ResearchAssistant make() {
ResearchAssistant ra = new ResearchAssistantImpl();
return ra;
}
}
class ResearchAssistantImpl : ResearchAssistant {
//定义三个字段:注意:与`PersonImpl,StudentImpl`和`FacultyImpl`中的字段完全无关
string _name;
string _faculty_addr;
string _student_addr;
this() { //构造器
_name = "ResAssis";
_faculty_addr = "lab";
_student_addr = "dorm";
}
//实现重用代码!置`withOverriddenProperty=false`,因为在此`impl`中覆盖它!
mixin FacultyM!(false); //
mixin StudentM!(false); //置`withOverriddenProperty=false`,因为在此`impl`中覆盖它!
//属性方法
override public string name() { return _name; }
override public string addr() { return dorm(); } //这里选择使用宿舍作为地址
override public string dorm() { return _student_addr; }
override public string lab() { return _faculty_addr; }
override string toString() {
return (format("%s: <%s %s %s>", name(), addr(), dorm(), lab()));
}
}
void main() {
ResearchAssistant ra = ResearchAssistant.make();
Faculty f = ra;
Student s = ra;
writeln(ra);
writeln(f);
writeln(s);
ra.doBenchwork(); //`doBenchwork takeRest`
ra.takeRest(); //
f.doBenchwork(); //`doBenchwork takeRest`
s.takeRest(); //
}
09-10
1344

04-27
423

04-18
286

04-11
219


2504d,12月会议
04-10
193


2025,倪五书的地址
04-01
152

03-28
241

03-26
97

03-25
205

03-20
115


2503d,d111更改
03-11
983

03-07
194


2503,D比C更易重构
03-04
339

02-26
235

02-22
195

02-13
171

02-05
1267


2502d,模板类型推导
02-05
204

02-01
924
