0

我正在使用带有 C# 的 SolidWorks API。

(参见http://help.solidworks.com/2012/English/api/sldworksapiprogguide/GettingStarted/Understanding_the_SolidWorks_API_Class_Hierarchy.htm?id=260f4593adf14e1198dc3fa3b4711bd7

通过向项目添加一系列 COM 引用,将其合并到 Visual Studio 中。API 带有各种类。我想创建一个子类,将方法添加到 API 附带的类中,以便为超类添加功能。

下面的代码显示了一个没有 API 的简单示例。当然,它工作得很好。

public class x
{
    public double a;
}

public class y : x
{
    public double b;

    public void setAandB(double aa, double bb)
    {
        this.a = aa;
        this.b = bb;
    }
}

这是我尝试使用子类添加方法的示例。超类是SketchPoint

public class SketchPointWriter : SketchPoint
{

    public void writeXML(XmlWriter writer, string nameElement)
    {
        writer.WriteStartElement(nameElement);
        writer.WriteString(Convert.ToString(((SketchPoint)this).X * 1000.0) + ", ");
        writer.WriteString(Convert.ToString(((SketchPoint)this).Y * 1000.0) + ", ");
        writer.WriteString(Convert.ToString(((SketchPoint)this).Z * 1000.0));
        writer.WriteEndElement();
    }
}

API 中的SketchPoint无法将自身写入 XML 文件。所以,我想通过创建一个子类,继承所有超类的属性和方法,将这个功能添加到类中,然后添加我的新方法。

请注意this的显式类型转换。如果没有这种类型转换,Visual Studio 不知道.Xthis的一个属性。就其本身而言,我觉得这很令人费解,所以我用一些重字体来解决它。

即使使用这种类型转换,它也不会编译,因为 Visual Studio 会抛出错误,因为我没有显式创建每个方法: 'ExportHOE.SketchPointWriter' 没有实现接口成员'SldWorks.ISketchPoint.Type'

这在我心中产生了一个难题。如果我需要重写所有方法,继承有什么意义?API 不是源代码,它是一个 DLL(?),所以我无权访问源代码。

所以,问题是:

  1. 我的代码是否正确并且 API 的实现方式实际上不允许继承它们自己的对象(它实际上是一个不允许继承的接口)?
  2. 我的代码是否写得不好并且重写代码会启用属性和方法的继承?
  3. 是否无法判断,因此,我真的应该放弃并编写另一个解决方案吗?
  4. 是否有一种聪明的解决方法,它不如原生 C# 理想,但创建了相同的功能?
4

2 回答 2

2

您引用的 Solidworks 文档中所述,SolidWorks 提供了基于 COM 的 API。COM(组件对象模型)是围绕接口继承构建的,并且不为您似乎正在寻找的实现继承提供内在支持。事实上,COM在设计上阻止您以任何方式访问各种对象的内部结构,而不是通过声明的接口。(有关COM 是什么和不是什么的简要概述,请参阅 MSDN 中的组件对象模型COM 对象和接口。)

所以,是的,他们的 API 以不支持继承其对象实现的方式实现。OTOH,听起来您的目标是使用 C# 为 Solidworks 提供的对象编写附加功能,同时仅依赖其公共接口。为此,您最好的选择是创建扩展方法,如下所示:

public static class SolidWorksExtensions
{
    public static void writeXml(this SketchPoint point, 
        XmlWriter writer, string nameElement)
    {
        writer.WriteStartElement(nameElement);
        writer.WriteString(Convert.ToString(point.X * 1000.0) + ", ");
        writer.WriteString(Convert.ToString(point.Y * 1000.0) + ", ");
        writer.WriteString(Convert.ToString(point.Z * 1000.0));
        writer.WriteEndElement();
    }
}
于 2014-05-25T02:59:04.647 回答
0

你可以使用装饰器模式来解决这个问题:

public class SketchPointWriter
{
   private SketchPoint _sketchPoint;

   public SketchPointWriter(SketchPoint sketchPoint)
   {
       _sketchPoint = sketchPoint;
   }

   public void writeXml(XmlWriter writer, string nameElement)
    {
        writer.WriteStartElement(nameElement);
        writer.WriteString(Convert.ToString(_sketchPoint.X * 1000.0) + ", ");
        writer.WriteString(Convert.ToString(_sketchPoint.Y * 1000.0) + ", ");
        writer.WriteString(Convert.ToString(_sketchPoint.Z * 1000.0));
        writer.WriteEndElement();
    }
}
于 2015-09-04T11:44:36.460 回答