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
我有一个 DLL,它是某些软件的基础,我需要在软件中使用它,但我需要添加一些变量。
这是我在 DLL
中的元素 classpublic 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