2306d的ddifi

文章展示了如何在D语言中使用接口和类来实现抽象概念,如Person、Faculty、Student和ResearchAssistant。通过接口继承和混合体模板,实现了代码重用和多态功能,如实验室工作、休息和地址属性的不同解释。ResearchAssistant类同时实现了Student和Faculty接口,具有特定的属性和行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#!/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();      //
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值