Абстрактные классы и свойства ReadOnly - PullRequest
8 голосов
/ 12 января 2011

Давайте иметь три класса;

Line
PoliLine
SuperPoliLine

для всех этих трех классов Distance определено.

Но только для Line можно установить Distance.

Есть ли возможность построить общий абстрактный (MustInherit) класс Segment, имеющий Distance как (абстрактный +? * 1019) * ReadOnly ) участник?

Вопрос для VB.NET , но ответы на C # тоже приветствуются.


Бизнес фон

Представь себе автобус. Он имеет много Station с, MainStation с и 2 TerminalStation с. Таким образом, Line находится между 2 станциями, PoliLine находится между 2 MainStation с, а SuperPoliLine находится между 2 терминальными станциями. Все «линии» являются «сегментами», но можно определить только расстояние A-> B между двумя станциями - Линия .

Ответы [ 3 ]

1 голос
/ 12 января 2011

Так как вы хотите, чтобы он устанавливался в одном классе, но не устанавливался в других, я бы обычно не использовал свойство для того, которое является «специальным» (в данном случае установщик).

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

public class Line : Segment
{
    public int SetDistance(int distance) { _distance = distance; }
}
1 голос
/ 12 января 2011
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
            }
        }
    }
1 голос
/ 12 января 2011

Нельзя переопределить и повторно объявить (добавить набор) одновременно - но вы можете сделать:

Базовый класс:

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 при необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...