如何正确使用抽象基类C#

时间:2012-03-16 11:13:06

标签: c# oop abstract-class

您好我正在用C#创建一个几何图形库...

我有一个抽象的类形状。 我已经定义了一个类向量(也代表(x,y)点)。

我想使用各种几何对象,曲线,线条,弧线,路径等

为此,我定义了一个抽象的Segment类,并派生了许多类,例如LineSegment(见下文),CurveSegmentArcCircleSegmentBezierCurveSegmentHalfInfiniteLine等。

我还定义了一个类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;
    }
}

3 个答案:

答案 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.