我正在使用带有C#的SolidWorks API。
通过向项目添加一系列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(?),因此我无法访问源代码。
所以,问题是:
答案 0 :(得分:2)
正如Solidworks documentation you referenced中所述,SolidWorks提供了基于COM的API。 COM(组件对象模型)围绕接口继承构建,并且不为您正在寻找的实现继承提供内在支持。实际上,COM 按设计会阻止您以任何方式访问各种对象的内部,而不是通过声明的接口。 (请参阅MSDN中的The Component Object Model和COM 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();
}
}