Dependency injection Arduino中的依赖注入
我已经开始与Arduino合作,我想做一个分时系统,这样我就不用delay命令了 当我试图注册从另一个继承的对象时,我遇到了一个问题 在这里,我有一个测试代码,应该显示在终端上:“哇哇喵喵…” 当我尝试创建一个接口时,我有疑问,我如何声明register()函数,以便在动物类型数组中输入Cat和Dog对象 以下代码仅用于显示问题:Dependency injection Arduino中的依赖注入,dependency-injection,arduino,Dependency Injection,Arduino,我已经开始与Arduino合作,我想做一个分时系统,这样我就不用delay命令了 当我试图注册从另一个继承的对象时,我遇到了一个问题 在这里,我有一个测试代码,应该显示在终端上:“哇哇喵喵…” 当我尝试创建一个接口时,我有疑问,我如何声明register()函数,以便在动物类型数组中输入Cat和Dog对象 以下代码仅用于显示问题: class Animal { public: void message() { } }; class Dog : public Animal
class Animal {
public:
void message() {
}
};
class Dog : public Animal {
public:
void message() {
Serial.println("Guau guau");
}
};
class Cat : public Animal {
public:
void message() {
Serial.println("Miau miau ");
}
};
class Multiplex {
private:
int index = 0;
Animal objects[5];
public:
void register(Animal object) {
objects[index] = object;
index++;
}
void go() {
for(int i = 0;i<index;i++) {
objects[i].message();
}
}
};
Dog dog;
Cat cat;
Multiplex multiplex;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
multiplex.register(dog);
multiplex.register(cat);
}
void loop() {
// put your main code here, to run repeatedly:
multiplex.go();
delay(1000);
}
类动物{
公众:
无效消息(){
}
};
犬类:公共动物{
公众:
无效消息(){
序列号:println(“Guau Guau”);
}
};
猫类:公共动物{
公众:
无效消息(){
Serial.println(“Miau-Miau”);
}
};
类多路复用{
私人:
int指数=0;
动物物品[5];
公众:
无效登记册(动物对象){
对象[索引]=对象;
索引++;
}
void go(){
对于(int i=0;i,在本例中,您必须使用多态性(虚拟方法)。但它仍然无法处理动物基类中“已注册”对象的这么多副本(因为调用了Animal::message()
,所以没有显示任何内容)。您必须使用指针(或引用-但在本例中并不容易)
class动物{//纯虚拟类(抽象类)
公众:
virtual void message()=0;//该'=0;'使整个类成为“纯虚拟的”
};
犬类:公共动物{
公众:
虚拟无效消息(){
序列号:println(“Guau Guau”);
}
};
猫类:公共动物{
公众:
虚拟无效消息(){
Serial.println(“Miau-Miau”);
}
};
类多路复用{
私人:
int指数=0;
动物*物体[5];
公众:
void reg(Animal*object){//传递指向该对象的指针
objects[index]=object;//对象必须始终有效
索引++;
}
void go(){
for(int i=0;imessage();
}
}
};
狗;
猫;
多路复用;
无效设置(){
//将安装代码放在此处,以便运行一次:
Serial.begin(9600);
multiplex.reg(&dog);
multiplex.reg(&cat);
}
void循环(){
//将主代码放在此处,以便重复运行:
多路复用。go();
延迟(1000);
}
如果您不喜欢动态多态性,那么必须使用诸如对象类型、开关和类型转换之类的东西来转换为正确的类型
class Animal { // pure virtual class (abstract class)
public:
virtual void message() = 0; // The '= 0;' makes whole class "pure virtual"
};
class Dog : public Animal {
public:
virtual void message() {
Serial.println("Guau guau");
}
};
class Cat : public Animal {
public:
virtual void message() {
Serial.println("Miau miau ");
}
};
class Multiplex {
private:
int index = 0;
Animal * objects[5];
public:
void reg(Animal * object) { // pass pointer to the object
objects[index] = object; // object must be valid for whole time
index++;
}
void go() {
for(int i = 0;i<index;i++) {
objects[i]->message();
}
}
};
Dog dog;
Cat cat;
Multiplex multiplex;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
multiplex.reg(&dog);
multiplex.reg(&cat);
}
void loop() {
// put your main code here, to run repeatedly:
multiplex.go();
delay(1000);
}