В C # нет способа заставить класс определять поле, используя интерфейс или абстрактный класс? - PullRequest
2 голосов
/ 10 августа 2011

Я хотел бы заставить набор классов определять три поля (типа string).В абстрактном классе я получаю, что поля не могут быть абстрактными, а в интерфейсе я получаю сообщение об ошибке, в котором говорится, что интерфейс не может содержать поле.Нет ли способа сделать это или я не правильно понимаю?Я бы предпочел не использовать методы, потому что по какой-то странной причине скобки раздражают меня.

Ответы [ 4 ]

6 голосов
/ 10 августа 2011

Вы можете использовать свойства для этого:

interface MyInterface {
  string Prop1 { get; set; }
  string Prop2 { get; set; }
  string Prop3 { get; set; }
}
4 голосов
/ 10 августа 2011

Вы можете использовать Свойства вместо полей:

// works similarly for Interfaces too
abstract class MyAbstractClass { public virtual string MyProperty1 { get; set; } }

class MyConcreteClass : MyAbstractClass {  }

Затем вы можете получить доступ к MyProperty1 из любого экземпляра, производного от MyAbstractClass:

MyAbstractClass obj1 = new MyConcreteClass;obj1.MyProperty1 = "abcd";

4 голосов
/ 10 августа 2011

Интерфейсные или абстрактные члены заставляют производные классы предоставлять код.
Поля не имеют кода.

Вам следует использовать свойство, которое можно использовать как поле, но имеет код.*

2 голосов
/ 10 августа 2011

Как и все остальные, используйте свойства вместо полей, но вы можете сделать что-то вроде того, что я интерпретировал в комментариях для членов только для чтения:

abstract public class Base
{
    abstract public string Foo { get; }
    abstract public string Bar { get; }
    abstract public string Baz { get; }
}

public class Derived : Base
{
    public override string Foo { get { return "foo"; } }
    public override string Bar { get { return "bar"; } }
    public override string Baz { get { return "baz"; } }
}

Если вы хотите, чтобы поля были модифицируемымипозже вам придется либо использовать автоматические свойства , либо объявить конкретные вспомогательные поля и пары getter / setter для каждого свойства.

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