C# 我怎么能有 base 类?

C# how i can have base classes?

我有一个 DLL,它是某些软件的基础,我需要在软件中使用它,但我需要添加一些变量。

这是我在 DLL

中的元素 class
public abstract class Element
{
    public PointF pStart = new PointF();
    public PointF pEnd = new PointF();

    public Element()
    {}

    public Element(Element source)
    {
        if (source != null)
        {
            pStart = source.pStart;
            pEnd = source.pEnd;
        }
    }

    public abstract void createSteps();
}

这是从 Element 派生的 class,总是在 DLL

public class ElementLine : Element
{

    public ElementLine()
    {}

    public ElementLine(ElementLine source): base(source)
    {}

    public override void createSteps()
    {
        Code for calculate steps....
    }
}

现在我需要向那些 class 添加一个 IntPtr 所以在我的软件中我创建了那些 classes:

Class 有广告基础的元素 class DLL 元素 Class

abstract class Element : BASECLASS.Element
{
    IntPtr entIntPtr;

    public IntPtr EntIntPtr
    {
        get => this.entIntPtr;
        set
        {
            this.entIntPtr = value;
        }
    }
}

现在我遇到了问题,因为我需要添加一个 class ElementLine,它具有 BASECLASS.ElementLine 的 createSteps 函数,但它也需要从 Element 派生。但是,如果我将 class 元素用作基础元素,我就没有 createSteps 函数。如果我使用 BASECLASS.ElementLine,我无法将元素转换为 ElementLine。

所以2种情况是:

问题是我无法将其转换为元素,因为它不是基础 class

class ElementLine : BASECLASS.ElementLine
{
    IntPtr entIntPtr;

    public PointF PStart
    {
        get => this.pStart;
        set
        {
            this.pStart = value;
        }
    }

    public PointF PEnd
    {
        get => this.pEnd;
        set
        {
            this.pEnd = value;
        }
    }

    public IntPtr EntIntPtr
    {
        get => this.entIntPtr;
        set
        {
            this.entIntPtr = value;
        }
    }
}

这里我可以将 ElementLine 转换为 Element,但我没有 BASECLASS.ElementLine 方法 createSteps()。因此,让这项工作起作用的唯一方法是从此处复制 BASECLASS.ElementLine 中的代码。但是我不喜欢

class ElementLine : Element
{
    IntPtr entIntPtr;

    public PointF PStart
    {
        get => this.pStart;
        set
        {
            this.pStart = value;
        }
    }

    public PointF PEnd
    {
        get => this.pEnd;
        set
        {
            this.pEnd = value;
        }
    }

    public override void createSteps()
    {
        throw new NotImplementedException();
    }
}

我希望一切都得到很好的解释,如果您有任何疑问,请随时与我联系

更新:

为了更好地理解我需要如何使用它,这里是另一部分。抱歉 mb 我需要先 post 它。

这是DLL中Elements的容器(还有Element,ElementLine,ElementArc,ecc...等多种类型)

public class Container
{
    public virtual List<Element> elements { get; set; } = new List<Element>();
}

在我的软件中,我将其替换为新元素,因为我需要使用新的 IntPtr 参数将元素类型从旧元素替换为新元素

public class Container : BASECLASS.Container
{
    new public List<Element> elements = new List<Element>();
}

问题是,例如,如果我有 ElementLine:BASECLASS.ElementLine,我需要执行一个 foreach 循环我不能做 foreach

foreach (Element element in container.elements)
        {
            if(element is ElementLine)
            {
                 ElementLine line = element as ElementLine;
            }
        }

这里我得到一个错误,因为 ElementLine 的基础 class 不是 Element 而是 BASECLASS.ElementLine

如果我输入 ElementLine : Element 我可以执行 foreach 但我不能使用 createSteps() 方法,因为每个 Element有自己的算法来计算步骤,所以我需要在元素上抽象它并在每个元素类型上实现它

最后的结果需要是: class 元素:BASECLASS.Element class 元素线:元素

所以 ElementLine 需要在 BASECLASS.Element 和 Element 中包含所有变量(没关系)但同时在 ElementLine createSteps() 方法中我想在 [=67= 中执行相同的代码] createSteps()

您需要的是使用接口并在需要时转换为每个接口。定义此接口:

public interface IIntPtr
{
    IntPtr EntIntPtr { get; set; }
}

创建 类:

public class Element2 : Element, IIntPtr
{
}

public class ElementLine2 : ElementLine, IIntPtr
{
}

当他们实现 IIntPtr 时,您必须在 类.

中添加 属性

现在,您可以像现在一样在 Element2 和 ElementLine2 中调用 createSteps。而且,如果你需要访问 EntIntPtr,你只需要做一个转换:

foreach (Element element in container.elements)
{
   // All are Element, so you can invoke this without any casting
   element.createSteps();

   var intPtr = element as IIntPtr;
   if (intPtr != null)
   {
      // Use intPtr.EntIntPtr
   }
}

经过一些尝试,我发现最漂亮的方法是在 class 中实例化一个基本元素并添加所需的值:

public class ElementLine : Element
{
    IntPtr EntIntPtr;
    BASECLASS.ElementLine line;

    public ElementLine()
    {}

    public ElementLine(ElementLine source): base(source)
    {}
}

通过这种方式,我可以在 DLL (line.createSteps()) 上使用 createSteps 函数,我可以向 class 添加值,例如 IntPtr,而我的 ElementLine 是派生的 class 的元素所以我可以将 ElementLine 转换为 Element