泛型和接口的替代方案

时间:2015-08-28 12:28:59

标签: c# generics interface c++-cli

首先:我正在使用C ++ - CLI,但是,正如用户所问,我认为这也适用于C#,这就是我添加此标记的原因。

我有以下功能

static CFiducial^ CFiducial::GetCommonBase (array<CFiducial^>^ i_aoFiducial)
{
  if (!i_aoFiducial || i_aoFiducial->Length <= 0)
    return gcnew CFiducial;

  CFiducial^ oFiducial;
  for (int iCnt = 0; iCnt < i_aoFiducial->Length; iCnt++)
  {
    if (!i_aoFiducial[iCnt]) continue;
    if (oFiducial)
      oFiducial= oFiducial->GetCommonBase (i_aoFiducial[iCnt]);
    else
      i_aoFiducial[iCnt]->CopyTo (oFiducial);
  }
  return oFiducial;
}

在多个班级中以相同的方式使用 (还有另一个成员函数GetCommonBase (CFiducial^),它将成员变量内容与传递对象成员的内容进行比较,并返回一个只有那些成员设置相等的新对象。请参阅下面的示例) 。

我现在打算将这个静态函数的所有实现外包,并将它们移动到一个中心位置,只有一个实现。我尝试过泛型和接口,但都失败了:

  • 泛型不起作用,因为我不能在泛型上调用方法。
  • 接口失败,因为接口中定义的函数需要获取接口稍后绑定的对象的实例。

这是将要使用的界面:

public interface class ICommonBase
{
  ICommonBase^        GetCommonBase (ICommonBase^);
  void                CopyTo (ICommonBase^%);
};

我无法在实际的类中实现GetCommonBase (ICommonBase^),我需要实现GetCommonBase (CLASSNAME^),但这与接口中的定义不匹配。

有没有办法解决这个问题? 接口和泛型是否有另一种选择?
我仍然希望避免将该函数复制并粘贴到我需要它的每个类中。

修改

成员函数GetCommonBase()的示例,它来自不同的类,其中实际使用了继承,因此名称。上面描述的问题与继承无关。

CImageObject^ CImgObjCircle::GetCommonBase (CImageObject^ i_oImageObject)
{
  CImageObject^ oImgObj;
  if (!i_oImageObject)
  {
    this->CopyTo (oImgObj);
    return oImgObj;
  }
  oImgObj = CImageObject::GetCommonBase (i_oImageObject);

  CImgObjCircle^ i_oImgObj = dynamic_cast<CImgObjCircle^>(i_oImageObject);
  if (!i_oImgObj)
    return oImgObj;
  CImgObjCircle^ oImgObjLocal = gcnew CImgObjCircle;
  oImgObj->CopyTo (oImgObjLocal);
  if (m_oDiameterX == i_oImgObj->m_oDiameterX) oImgObjLocal->m_oDiameterX = m_oDiameterX;

  return oImgObjLocal;
}

0 个答案:

没有答案