2011-01-06 4 views
3

У меня есть приложение 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; 
    } 
} 

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

ответ

0

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

public class Foo : Base 
{ 
    DateTime start_time_; 

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

    internal void SetStartTime 
    { 
     start_time_ = value; 
    } 
} 

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

3

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

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; } 
     } 
    } 
+0

+1 Скорее меня :-) –

+2

Поскольку интерфейс не является заменой абстрактного базового класса: / –

0

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

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

1

Вы можете сделать это следующим образом:

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; 
     } 
    } 
} 

Необязательно использовать интерфейс.

Смежные вопросы