您好我正在用C#创建一个几何图形库...
我有一个抽象的类形状。 我已经定义了一个类向量(也代表(x,y)点)。
我想使用各种几何对象,曲线,线条,弧线,路径等
为此,我定义了一个抽象的Segment
类,并派生了许多类,例如LineSegment
(见下文),CurveSegment
,ArcCircleSegment
,BezierCurveSegment
,HalfInfiniteLine
等。
我还定义了一个类Path
(非抽象),它用于表示连接在一起的多个段(就像您可能从绘图应用程序中获得的那些)。在此,我包括一个分段的成员(List<Segment>
)。
然后我希望从Path
派生类,关键示例是LinePath
,它应该只包含LineSegments
。我遇到的问题是我希望能够在LinePath
对象上调用get属性,假设它将返回LineSegment
。如果没有每次明确转换,这可能吗?
我想避免使Path
抽象,因为我可能有多个Segment类型的路径。
public class LineSegment : Segment
{
private vector m_start;
private vector m_end;
private vector m_vector;
public vector Start
{
get { return m_start; }
set { m_start = value; }
}
public vector End
{
get { return m_end; }
set { m_end = value; }
}
public vector Vec
{
get { return m_vector; }
set { m_vector = value; }
}
public double Length()
{
return Vec.length();
}
public LineSegment(vector v0, vector v1):base()
{
this.Start.x = v0.x;
this.Start.y = v0.y;
this.End.x = v1.x;
this.End.y = v1.y;
this.Vec = this.End - this.Start;
}
}
答案 0 :(得分:2)
如果我理解你想要什么,你可以这样做:
使您的路径类通用
public class Path<T> where T : Segment
{
private IList<T> segments = new List<T>();
public IList<T> Segments { get { return this.segments; } }
}
然后,您可以创建LinePath对象
public class LinePath : Path<LineSegment>
{
}
通过这种方式,您可以确保LinePath.Segments
中的所有细分都是LineSegments
,同时仍然可以针对Path
的任何操作重复使用Segment
类}。
答案 1 :(得分:0)
您可以在派生类上重新定义Path属性。 LinePath可以有:
public new List<LineSegment> Segments
{
get
{
return (List<LineSegment>)base.Segments;
}
}
这样您就可以强制使用正确的类型。
答案 2 :(得分:0)
当你有一个要求,你的基类应该提供某些方法的默认实现,而其他方法应该被子类重写,使用抽象类。
例如再举一个上面的Vehicle类的例子。如果我们希望从Vehicle派生的所有类以固定方式实现Drive()方法,而其他方法可以被子类重写。在这种情况下,我们将Vehicle类实现为具有Drive实现的抽象类,同时将其他方法/属性保留为抽象,以便它们可以被子类重写。
- &GT; 抽象类的目的是提供多个派生类可以共享的基类的通用定义。
例如,类库可以定义一个抽象类,该抽象类用作其许多函数的参数,并要求程序员使用该库通过创建派生类来提供自己的类实现。
使用抽象类
When creating a class library which will be widely distributed or reused—especially to clients, use an abstract class in preference to an interface; because, it simplifies versioning. This is the practice used by the Microsoft team which developed the Base Class Library. ( COM was designed around interfaces.)
Use an abstract class to define a common base class for a family of types.
Use an abstract class to provide default behavior.
Subclass only a base class in a hierarchy to which the class logically belongs.