C#/从COM Reference(SolidWorks API)继承方法和属性

时间:2014-05-24 04:50:11

标签: c# visual-studio-2012 inheritance solidworks

我正在使用带有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文件。所以,我想通过创建一个子类,继承所有超类的属性和方法,然后添加我的新方法,将这个功能添加到类中。

请注意的明确类型转换。如果没有此类型转换,Visual Studio不会意识到 .X 的属性。就其本身而言,我觉得这很令人费解,所以我用一些重型铸件来解决它。

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

这在我的脑海里创造了一个难题。如果我需要重写所有方法,那么继承的重点是什么? API不是源代码,它是DLL(?),因此我无法访问源代码。

所以,问题是:

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

2 个答案:

答案 0 :(得分:2)

正如Solidworks documentation you referenced中所述,SolidWorks提供了基于COM的API。 COM(组件对象模型)围绕接口继承构建,并且不为您正在寻找的实现继承提供内在支持。实际上,COM 按设计会阻止您以任何方式访问各种对象的内部,而不是通过声明的接口。 (请参阅MSDN中的The Component Object ModelCOM Objects and Interfaces,以简要了解COM是什么和不是什么。)

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

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

答案 1 :(得分: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();
    }
}