2017-02-16 52 views
0

我有一个Collection类,它旨在存储不同类型的对象,但是我想调用这些类共享的特定方法名称(例如ToString())。如何在MQL中调用未知类的方法?

这里是我的尝试:

class Collection { 
    public: 
    void *data[]; 

    void Collection() {} 
    void ~Collection() { 
     for (int i = 0; i < ArraySize(data); i++) { 
     if (CheckPointer(data[i]) == POINTER_DYNAMIC) delete data[i]; 
     } 
    } 

    void *Add(void *_object) { 
     uint _size = ArraySize(data); 
     ArrayResize(data, _size + 1, 100); 
     data[_size] = _object; 
     return _object; 
    } 

    string ToString(string _dlm = ",") { 
     string _out = ""; 
     for (int i = 0; i < ArraySize(data); i++) { 
     if (CheckPointer(data[i]) == POINTER_DYNAMIC) { 
      _out += ((void *) data[i]).ToString(); // @fixme: Syntax error. 
     } 
     } 
     return _out; 
    } 

}; 

但是使用((void *) data[i]).ToString()语法失败:

'的ToString' - 没有定义Collection.mqh

我怎样才能调用成员函数每个存储对象有一个ToString()方法?

回答

1

在我看来,它应该是类似于collection.toString()其中collection是您的class Collection的一个对象。然后,添加到集合中的每个对象都应该实现此功能......也许更容易提及一些支持toString()(或与此方法接口)的超类,并确保只添加正确的对象?这也使得你的代码在运行时没有意外的错误。

另外CArrayObjat your disposal与大部分功能,如果你需要toString()或任何其他功能,那么你可以简单地扩展基本类。也许默认集合的唯一缺点是它存储了CObject-后继对象。

0

这可以通过创建an abstract class来实现,其中所有类可以共享相同的虚拟方法。例如:

class Object { 
    public: 
    virtual string ToString() = NULL; 
}; 

class Foo : public Object { 
    public: 
    virtual string ToString() { 
     return "Foo"; 
    }; 
}; 

class Bar : public Object { 
    public: 
    virtual string ToString() { 
     return "Bar"; 
    }; 
}; 

然后在Collection类下面的方法:

virtual string ToString(string _dlm = ",") { 
    string _out = ""; 
    for (int i = 0; i < ArraySize(data); i++) { 
    if (CheckPointer(data[i]) == POINTER_DYNAMIC) { 
     _out += ((Object *) data[i]).ToString() + _dlm; 
    } 
    } 
    return _out; 
} 

示例用法:

Collection *objects; 
objects = new Collection; 
Foo *foo = new Foo(); 
Bar *bar = new Bar(); 
objects.Add(foo); 
objects.Add(bar); 
Print(objects.ToString()); 
delete objects; 
相关问题