Наследовать от абстрактного класса со свойствами другого типа (.NET 3.5, C #) - PullRequest
3 голосов
/ 17 мая 2011

У меня есть 3 следующих класса:

public class BaseProperty1{
    public string Property1 {get; set;}
}

public class ChildProperty1 : BaseProperty1 {

}

public abstract class Base{
    public abstract BaseProperty1 bp1 {get; set;}
}

Я пытаюсь извлечь следующий класс из Base:

public class Child : Base{
    public ChildProperty1 bp1 {get; set;}
}

Но я получаю сообщение об ошибке, что методы set и get не реализованы. Это просто синтаксис, который я использую, или мой образ мышления неверен?

Спасибо!

Ответы [ 2 ]

5 голосов
/ 17 мая 2011

Вы не сможете использовать Auto Properties, так как вам нужно точно соответствовать типу базового класса.Вам придется пойти по старинке:

public abstract class Child : Base
{
    private ChildProperty1 _bp1;

    public BaseProperty1 bp1
    {
        get { return _bp1; }

        // Setter will be tricky. This implementation will default to null
        // if the cast is bad.
        set { _pb1 = value as ChildProperty1; }
    }
}

Вы также можете использовать дженерики для решения проблемы:

public abstract class Parent<TProp> where TProp : BaseProperty1
{
    public abstract T bp1 { get; set; }
}

public abstract class Child : Parent<ChildProperty1>
{
    public ChildProperty1 bp1 { get; set; }
}
0 голосов
/ 17 мая 2011

Если вы пометите метод или свойство как abstract , вы должны реализовать его в унаследованном классе.Вы можете скрыть старое свойство (bp1 в базовом классе) и написать новое с другим типом возвращаемого значения, например:

public abstract class Base{
    public BaseProperty1 bp1 {get; set;} //without abstract identifier
}

public class Child : Base
{
       public new ChildProperty1 bp1 { get; set; } // with new modifier
}
...