通过构造函数参数实例化子类

Posted

技术标签:

【中文标题】通过构造函数参数实例化子类【英文标题】:instantiate childclass via constructor param 【发布时间】:2015-04-13 07:31:40 【问题描述】:

我目前正在尝试实现一个接口来创建排序算法的实例。

我有以下类:ISortAlgorithm -> 抽象(接口”类)AlgorithmModule -> 带有静态函数 ->

static ISortAlgorithm* CreateSortInstanceOf(EAlgorithm AlgorithmEnum)

还有一个类容器(命名空间算法),其中包含 ISortAlgorithm 的子类,例如 ->

class SelectionSort : public ISortAlgorithm

每个实现的算法也存在枚举 ->

enum EAlgorithm SELECTIONSORT, BUBBLESORT, ...

在运行时有人想要使用我模块中的算法,他调用:

AlgorithmModule::CreateSortInstanceOf(/*enum of desired algorithm */)

我在该函数中做的第一件事是 ->


switch (enumparam)

case (EAlgorithm::INSERTSORT) :
        return SortAlgorithm = new Algorithms::InsertSort();
        break;
case (blah): [..]

这已经奏效了。但是现在我想了一种方法来简化它,我想出了可以为此使用构造函数的想法并尝试:

class InsertSort : public ISortAlgorithm

public:
    InsertSort() : ISortAlgorithm(EAlgorithm::INSERTSORT)


class SelectionSort : public ISortAlgorithm

public:
    SelectionSort() : ISortAlgorithm(EAlgorithm::SELECTIONSORT) 

除此之外,我将 CreateSortInstanceOf 修改为:

static ISortAlgorithm* CreateSortInstanceOf(EAlgorithm AlgorithmEnum)

    ISortAlgorithm* SortAlgorithm = new ISortAlgorithm(AlgorithmEnum);  
    return SortAlgorithm;

所以意图是,使用构造函数参数来调用正确的子类。这意味着我不必为将来要实现的任何算法更改此函数的代码。但是,编译器当然会抱怨,我无法实例化抽象类,我认为另一个问题是 ctor 的非继承。

但我确信,我的意图应该是可能的,所以我需要你的帮助来指出我在这里缺少的东西。

最好的问候

【问题讨论】:

【参考方案1】:

这是一种做你想做的事的方法,即使它不一定是最好的:



    #include "stdafx.h"
    #include "map"

    enum EAlgorithm  SELECTIONSORT=0, INSERTSORT=1 ;

    class ISortAlgorithm;
    typedef ISortAlgorithm * (*fct)(void);
    std::map mapCreator;

    class ISortAlgorithm
    
        public:
        ISortAlgorithm(void) ;
        virtual void run(void) = 0;
        static ISortAlgorithm* CreateSortInstanceOf(EAlgorithm AlgorithmEnum)
        
            std::map::iterator it = mapCreator.find(AlgorithmEnum);
            if (it == mapCreator.end())
                return NULL;
            return it->second();
        
    ;

    class InsertSort : public ISortAlgorithm
    
        public:
        InsertSort()
        virtual void run(void);
        static ISortAlgorithm * Create(void)
        
            return (ISortAlgorithm*) new InsertSort();
        ;
    ;

    class SelectionSort : public ISortAlgorithm
    
        public:
        SelectionSort();
        virtual void run(void);
        static ISortAlgorithm * Create(void)
        
            return (ISortAlgorithm*) new SelectionSort();
        ;
    ;

    int _tmain(int argc, _TCHAR* argv[])
    
        mapCreator.insert(std::pair(EAlgorithm::INSERTSORT, InsertSort::Create));
        mapCreator.insert(std::pair(EAlgorithm::SELECTIONSORT, SelectionSort::Create));
        ISortAlgorithm * pt1 = ISortAlgorithm::CreateSortInstanceOf(EAlgorithm::INSERTSORT);
        ISortAlgorithm * pt2 = ISortAlgorithm::CreateSortInstanceOf(EAlgorithm::SELECTIONSORT);
        return 0;
    

【讨论】:

以上是关于通过构造函数参数实例化子类的主要内容,如果未能解决你的问题,请参考以下文章

11.子类实例化过程

super在构造函数中的运用

当参数是构造函数的参数声明类型的子类时,反射找不到构造函数

Python 3:当子构造函数的参数多于父构造函数时,从继承的方法返回新的子类实例

Java Day 09

继承&构造函数