реализация поля чтения / записи для интерфейса, который определяет только чтение - PullRequest
3 голосов
/ 07 января 2011

У меня есть приложение на C # 2.0, в котором базовый интерфейс обеспечивает доступ только для чтения к значению в конкретном классе.Но в конкретном классе я хотел бы иметь доступ на чтение / запись к этому значению.Итак, у меня есть такая реализация:

public abstract class Base
{
    public abstract DateTime StartTime { get; }
}

public class Foo : Base
{
    DateTime start_time_;

    public override DateTime StartTime
    {
        get { return start_time_; }
        internal set { start_time_ = value; }
    }
}

Но это дает мне ошибку:

Foo.cs(200,22): error CS0546: 'Foo.StartTime.set': cannot override because 'Base.StartTime' does not have an overridable set accessor

Я не хочу, чтобы у базового класса был доступ для записи.Но я хочу, чтобы конкретный класс предоставлял доступ для чтения / записи.Есть ли способ заставить это работать?

Спасибо, PaulH


К сожалению, Base нельзя изменить на интерфейс, поскольку он также содержит неабстрактную функциональность.Что-то, что я должен был бы добавить в исходное описание проблемы.

public abstract class Base
{
    public abstract DateTime StartTime { get; }

    public void Buzz()
    {
        // do something interesting...
    }
}

Мое решение - сделать это:

public class Foo : Base
{
    DateTime start_time_;

    public override DateTime StartTime
    {
        get { return start_time_; }
    }

    internal void SetStartTime
    {
        start_time_ = value;
    }
}

Это не так хорошо, как хотелось бы, ноработы.

Ответы [ 4 ]

3 голосов
/ 07 января 2011

Есть ли причина не использовать интерфейс над абстрактным классом?

    public interface Base
    {
        DateTime StartTime { get; }
    }

    public class Foo : Base
    {
        DateTime start_time_;

        public DateTime StartTime
        {
            get { return start_time_; }
            internal set { start_time_ = value; }
        }
    }
1 голос
/ 07 января 2011

Вы можете сделать это так:

public abstract class Base
{
    public abstract DateTime StartTime { get; internal set; }
}
public class Foo : Base
{
    DateTime start_time_;
    public override DateTime StartTime
    {
        get
        { 
            return start_time_; 
        }
        internal set
        {
            start_time_ = value;
        }
    }
} 

По выбору, используйте интерфейс.

0 голосов
/ 13 января 2011

Мое решение состоит в том, чтобы сделать это:

public class Foo : Base
{
    DateTime start_time_;

    public override DateTime StartTime
    {
        get { return start_time_; }
    }

    internal void SetStartTime
    {
        start_time_ = value;
    }
}

Это не так хорошо, как хотелось бы, но работает.

0 голосов
/ 07 января 2011

Вы не можете сделать это при наследовании от базового класса, но вы можете сделать это при реализации интерфейса.

Так что если вы можете вместо этого заменить базовый класс интерфейсом, он будет работать.

...