抽象类和ReadOnly属性

时间:2011-01-12 18:55:22

标签: c# .net vb.net oop

我们有三个班级;

Line
PoliLine
SuperPoliLine

对于所有三个类Distance已定义。

但只有Line才能设置Distance

是否有可能构建一个共同的抽象(MustInherit)类 Segment ,具有 Distance as(抽象+? ReadOnly )成员?

VB.NET 的问题,但也欢迎C#答案。


业务背景

想象一下公共汽车。它有很多Station s,MainStation和2 TerminalStation s。因此 Line 位于2个工作站之间, PoliLine 位于2 MainStation s之间,而SuperPoliLine位于2个TerminalStations之间。所有“行”都是“段”,但只能定义2个站之间的距离A-> B < - em> Line 。

3 个答案:

答案 0 :(得分:1)

您不能同时覆盖和重新声明(添加集合) - 但您可以这样做:

基类:

protected virtual int FooImpl { get; set; } // or abstract
public int Foo { get { return FooImpl; } }

派生类:

new public int Foo {
    get { return FooImpl; }
    set { FooImpl = value; }
}

// your implementation here... 
protected override FooImpl { get { ... } set { ... } }

现在您也可以根据需要覆盖FooImpl。

答案 1 :(得分:1)

由于您希望它在一个类中可设置但在其他类中无法设置,我通常不会使用属性为“特殊”(在本例中为setter)。

public class Segment
{
    protected int _distance;
    public int Distance { get { return _distance; } }
}

public class Line : Segment
{
    public int SetDistance(int distance) { _distance = distance; }
}

答案 2 :(得分:1)

public class Segment
{
    private int distance;
    public virtual int Distance
    {
        get { return distance; }
        set { distance = value; }
    }
}

public class Line : Segment
{
    public override int Distance
    {
        get { return base.Distance; }
        set
        {
            // do nothing
        }
    }
}

编辑版本:

    public abstract class Segment
    {            
        public abstract int Distance { get; set; }
    }

    public class Line : Segment
    {
        private int distance;
        public override int Distance
        {
            get { return distance; }
            set
            {
                // do nothing
            }
        }
    }