【问题标题】:How to run according to interface type如何根据接口类型运行
【发布时间】:2018-02-18 15:33:14
【问题描述】:

我需要一段代码按照调用的接口运行,例如下面的代码:

public class VirtualStreamingFiler : IBFiler, IAFiler
{
    public VirtualStreamingFiler()
    {
        cout << "I like " << interface_func_type_return() << " too!\n";
    }
}

interface_func_type_return()会根据使用的接口返回一个字符串,如果IAFiler返回“A_string_request”,如果IBFiler返回“general_purpose_B”

int main ()
{
  IAFiler _vpnFiler = new VirtualStreamingFiler();
  return 0;
}

所以这里的输出将是:

A_string_request

我该怎么做??

谢谢

【问题讨论】:

  • 假设 _vpnFiler 的丢失指针声明只是一个遗漏,您的代码在语义上与以下代码相同:void* tmp = new VirtualStreamingFiler(); IAFiler* _vpnFiler = (IAFiler*)tmp; 类型不知道在构造它的数千个周期后如何使用它。您是否考虑需要您修改接口或 Filer 类或围绕它们创建一些包装器的替代方法?
  • 感谢您的帮助!当然,我愿意尝试新方法,建议我如何做那个包装器? (我对编程有点陌生,所以对低级问题感到抱歉)

标签: c++ c++11 visual-c++


【解决方案1】:

如果你需要一个函数来做两件不同的事情,你需要两个不同的函数。一个类中的两个不同函数可以具有相同名称和相同签名的唯一方法是至少其中一个不是虚拟的并且它们来自不同的基类。

class A
{
   public:  void func () { funcA(); }
   private: void funcA() = 0;
};

class B
{
   public:  void func () { funcB(); }
   private: void funcB() = 0;
};

class AB : public A, public B
{
   void funcA() { do something; }
   void funcB() { do something else; }
};

然而,这是一个非常值得怀疑的设计,在实施之前我会三思而后行。

【讨论】:

    【解决方案2】:

    如果您想根据创建后如何使用类来运行某些代码,最好将该代码与创建代码(以及一般的类代码)分离,并委托运行该代码(并弄清楚应该使用什么代码)运行)在对象创建到某个其他实体的那一刻。 示例:

    #include <iostream>
    #include <memory>
    #include <string>
    
    struct IAFiler 
    { virtual ~IAFiler() = default; };
    
    struct IBFiler 
    { virtual ~IBFiler() = default; };
    
    struct VirtualStreamingFiler : IAFiler, IBFiler
    {};
    
    class VirtualStreamingFilerFactory
    {
        template <typename T>
        static std::string usage_type();
    
    public:
        template <typename T>
        static std::unique_ptr<T> create()
        {
            std::cout << "I like " << usage_type<T>() << " too!\n";
            return std::make_unique<VirtualStreamingFiler>();
        }
    };
    
    template <>
    std::string VirtualStreamingFilerFactory::usage_type<IAFiler>() { return "A_string_request"; }
    
    template <>
    std::string VirtualStreamingFilerFactory::usage_type<IBFiler>() { return "general_purpose_B"; }
    
    template <typename T>
    std::string VirtualStreamingFilerFactory::usage_type() { return "no_data"; }
    
    int main()
    {
        auto _vpnFiler = VirtualStreamingFilerFactory::create<IAFiler>();
    }
    

    【讨论】:

      猜你喜欢
      • 2013-01-04
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      • 2016-08-29
      • 1970-01-01
      相关资源
      最近更新 更多