c# /从COM引用(SolidWorks API)继承方法和属性

本文关键字:继承 方法 属性 API SolidWorks COM 引用 | 更新日期: 2023-09-27 18:05:08

我正在使用SolidWorks API与c#。

(见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文件的能力。因此,我想通过创建一个子类,继承所有超类的属性和方法,然后添加我的新方法,从而将这个功能添加到类中。

请注意这个的显式类型转换。如果没有这种类型转换,Visual Studio就不会意识到。Xthis的属性。就其本身而言,我发现这令人困惑,所以我用一些重类型转换来解决它。

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

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

所以,问题是:

  1. 我的代码是正确的,API的实现方式,不允许继承自己的对象(它实际上是一个接口,不允许继承)?
  2. 我的代码写得不好,重写代码将使属性和方法的继承?
  3. 这是不可能的,因此,我真的应该放弃并编写另一个解决方案吗?
  4. 是否有一个聪明的解决方案,不像原生c#那样理想,但创建相同的功能?

c# /从COM引用(SolidWorks API)继承方法和属性

正如您引用的Solidworks文档中所述,Solidworks提供了基于com的API。COM(组件对象模型)是围绕接口继承构建的,并且没有为您似乎正在寻找的实现继承提供内在支持。实际上,COM 通过设计阻止您以除了通过声明的接口之外的任何方式访问各种对象的内部。(请参阅MSDN中的组件对象模型和COM对象和接口,了解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();
    }
}

您可以使用Decorator Pattern:

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();
    }
}