簡體   English   中英

C#/從COM Reference(SolidWorks API)繼承方法和屬性

[英]C# / inherit methods and properties from COM Reference (SolidWorks API)

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

(參見http://help.solidworks.com/2012/English/api/sldworksapiprogguide/GettingStarted/Understanding_the_SolidWorks_API_Class_Hierarchy.htm?id=260f4593adf1411198dc3fa3b4711bd7

通過向項目添加一系列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#那樣理想,但創建相同的功能?

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

您可以使用裝飾器模式:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM