0

我几乎没有设计问题:我有一个工厂将创建一种或另一种类型的对象。但是我的客户要求是将来自外部世界的数据(通过 setter 方法)提供(提供)给类型 1 的具体类,而不是类型 2。

如果我将这些 setter 方法放在接口中,则需要在两个具体类中强制实现这些方法。这不是我的要求。我想为第一种类型(一些设置器)提供一种数据,并想为其他类型提供另一种数据(可能与先前类型包含的设置器不同。)

例如

     class ISubjectExecutor
     {
         public:
        virtual void ISUBJECTEXECUTOR_EXPORTS_API Execute()=0;  
     };

     class COMExecutor: public ISubjectExecutor
     {
      public: 
     virtual void Execute()=0;
            void setCLSID();
            void setGuids();

     };
     class Win32Executor : public IWin32Executor
     {
       public:               
      virtual void Execute()=0;
            void setFilePath();

     }; 

现在在这里我不能使用 ISubjectExecutor (*pSubjectExecutor) 的指针在从工厂接收指针 (ISubjectExecutor) 后的任何时候调用我选择的 Win32Executor 或 COMExecutor 的 setter 方法。因为这些所有的 setter 永远不会存在于 ISubjectExecutor 接口中,并且您无法访问任何从未包含在接口中并且存在于具体实现中的方法。

如何解决这个设计问题来解决。?

问候哈桑

4

1 回答 1

0

您可以在基类中定义一个或多个纯虚方法,允许通过标记/值设置属性(使用适当的值类型和标记的枚举)。然后派生类为它们支持的标记值的子集实现代码,如果调用它们不支持的属性,可能会抛出某种“不支持”异常(或返回 false?)。在这里,我使用 std::string 来表示值,但您可能需要不同的类型或其他重载。

 class ISubjectExecutor
 {
     public:
    virtual void ISUBJECTEXECUTOR_EXPORTS_API Execute()=0;  
    virtual void SetProperty(const Tag tag, const std::string& value) = 0;

   // full list of tags in all subclasses
   enum Tag {
     Guids,
     FilePath,
     CLSID
   };     
 };



 class COMExecutor: public ISubjectExecutor
 {
  public: 
    virtual void Execute()=0;

    // Valid tags are Guids, CLSID
    virtual void SetProperty(const Tag tag, const std::string& value);

 };
 class Win32Executor : public IWin32Executor
 {
   public:               
  virtual void Execute()=0;

    // Valid tags are FilePath
    virtual void SetProperty(const Tag tag, const std::string& value);
 }; 

现在SetProperty通过指向 的指针调用是合法的ISubjectExecutor

于 2010-10-03T13:44:18.857 回答