使用静态方法创建基的C#类

使用静态方法创建基的C#类,c#,methods,static,factory,C#,Methods,Static,Factory,我正在开发一个独立的C#SolidWorks API应用程序,它可以进行参数化建模。访问软件对象的功能需要多种类型/接口。SketchLine类型的对象只是草图中的一条线,需要转换为SketchSegment类型才能访问GetLength()方法,并且需要转换为实体类型才能向其添加属性,而要获取其持久ID,我需要使用ModelDocExtension类型的对象的方法等。。。为了简化建模,我在新类中公开了不同类型/接口中与SW对象相关的方法,而引用实际SW对象的字段位于某个祖先类中 class G

我正在开发一个独立的C#SolidWorks API应用程序,它可以进行参数化建模。访问软件对象的功能需要多种类型/接口。SketchLine类型的对象只是草图中的一条线,需要转换为SketchSegment类型才能访问GetLength()方法,并且需要转换为实体类型才能向其添加属性,而要获取其持久ID,我需要使用ModelDocExtension类型的对象的方法等。。。为了简化建模,我在新类中公开了不同类型/接口中与SW对象相关的方法,而引用实际SW对象的字段位于某个祖先类中

class GreatAncestor
{
    public GreatAncestor(SketchPoint swPoint)
}

我有一个工厂类,其中包含返回类对象的方法。这是一个很大的类,有很多方法。Factory类的方法看起来非常相似:它们首先创建SolidWorks对象,然后将其传递给我的类:

class Factory
{
    public MySketchPoint CreateSketchPoint(double X, double Y)
    {
        SketchPoint swPoint SketchManager.CreatePoint(X, Y, 0);
        // CreatePoint is a SW API method

        MySketchPoint MyPoint = new MySketchPoint(swPoint);
        return MyPoint;
    }
}
我认为在我的类中包含静态方法而不使用工厂类会更整洁:

class MySketchPoint : Ancestor
{
    private static SketchPoint CreateSketchPoint(double X, double Y)
    // this method creates a point in the sketch in SolidWorks and returns it's reference

    public MySketchLine (double X, double Y):
        base (CreateSketchPoint(double X, double Y))
}
在编写建模代码时:

MySketchPoint Point = new MySketchPoint(10,20);
vs

这种设计并没有为我节省任何编码行,但它允许我将所有相关项目放在一个地方,同时减少一个大类。在我的类中,它确实给了我一个我不喜欢的静态方法


我想知道这种设计的缺点和适用性。

假设您是从工厂方法中安全地创建实例,在不了解应用程序总体设计的情况下,我看不到任何直接的缺点。它看起来像工厂方法模式的一个相当典型的实现,这是非常常见的,并且提供了封装和组织您的创作逻辑的好处

作为一般原则,我唯一要注意的是以某种方式实现某些东西,这仅仅是因为您喜欢代码在不同方面的外观。有一个这样实现它的理由,这样当有人问起它时,你就可以解释为什么它会存在

如果您不喜欢将静态成员与实例成员混合在一起,您可以始终将静态方法放在单独的工厂类中,以保持它们的分离


希望这有助于回答您的问题。

考虑到您本身没有编码问题,最好在
class MySketchPoint : Ancestor
{
    private static SketchPoint CreateSketchPoint(double X, double Y)
    // this method creates a point in the sketch in SolidWorks and returns it's reference

    public MySketchLine (double X, double Y):
        base (CreateSketchPoint(double X, double Y))
}
MySketchPoint Point = new MySketchPoint(10,20);
MySketchPoint Point = Factory.CreateMySketchPoint(10,20);