Свойства c # в абстрактных базовых классах - PullRequest
6 голосов
/ 27 августа 2009

У меня странная проблема, которую я не смог решить. Когда я пытаюсь скомпилировать следующий фрагмент кода, я получаю эту ошибку:

AbstractClass не реализует элемент интерфейса «Свойство» (ошибка компилятора CS0535)

Онлайновая справка говорит мне, чтобы я сделал мой AbstractClass абстрактным. Кто-нибудь может сказать мне, где я ошибся?

Приветствия Rüdiger

public interface IBase {
    string Property { get; }
}

public abstract class AbstractClass : IBase
{
    public override string ToString()
    {
        return "I am abstract";
    }
}

public class ConcreteClass : AbstractClass
{
    string Property { 
        get {
            return "I am Concrete";
        }
    }
}

Ответы [ 7 ]

20 голосов
/ 27 августа 2009

Ваш AbstractClass должен предоставить реализацию для Property из интерфейса IBase, даже если он просто абстрагируется:

public abstract class AbstractClass : IBase
{
    public override string ToString()
    {
        return "I am abstract";
    }

    public abstract string Property { get; }
}

Обновление: Люк прав, что конкретная реализация должна будет указать, что Property является переопределением, в противном случае вы получите ошибку "не реализуется унаследованный абстрактный член":

public class ConcreteClass : AbstractClass
{
    public override string Property { 
        get {
            return "I am Concrete";
        }
    }
}
3 голосов
/ 27 августа 2009

Вы должны добавить абстрактную реализацию свойства к вашему AbstractClass:

public abstract class AbstractClass : IBase
{
    public override string ToString()
    {
        return "I am abstract";
    }

    public abstract string Property { get; }

}

И ключевое слово override для класса Concrete

2 голосов
/ 27 августа 2009

Вам необходимо объявить Property в AbstractClass, чтобы выполнить IBase контракт.

Если вы хотите, чтобы ConcreteClass имел возможность переопределить Property, вы должны объявить его как abstract или virtual. Затем вам нужно объявить ConcreteClass реализацию Property с override.

    public interface IBase
    {
        string Property { get; }
    }

    public abstract class AbstractClass : IBase
    {
        public abstract string Property { get; }

        public override string ToString()
        {
            return "I am abstract";
        }
    }

    public class ConcreteClass : AbstractClass
    {
        public override string Property
        {
            get
            {
                return "I am Concrete";
            }
        }
    }
2 голосов
/ 27 августа 2009

Ваш абстрактный класс не реализует интерфейс IBase. Просто добавьте свойство Property к AbstractClass.

public abstract String Property { get; }
2 голосов
/ 27 августа 2009

AbstractClass должен реализовывать IBase, который содержит свойство, а вы его не реализовали

1 голос
/ 27 августа 2009

Вы должны реализовать свойство Property в абстрактном классе.

1 голос
/ 27 августа 2009

Вам необходимо реализовать свойство IBase * следующим образом:

public abstract class AbstractClass : IBase
{
    public override string Property()
    {
        return "This is the base-class implementation";
    }
}

Или сделать это Аннотация .

...