Свойства дочернего класса не видны

#c# #inheritance

#c# #Наследование

Вопрос:

Я довольно новичок в c # и очень новичок в абстрактных классах. Ниже приведен пример кода, который я пишу. Я создаю экземпляр своего объекта с Parent obj = new Child2(); помощью или Parent obj = new Child3();

Обратите внимание, что целью этого является то, что дочерние элементы 2 и 3 имеют разные свойства, но некоторые общие, перегруженные методы.

Моя проблема в том, что я не вижу никаких свойств в дочернем классе

если я недостаточно подробно описал вопрос, пожалуйста, дайте мне знать, и я уточню

 namespace ns
{
    public class Parent
    {
        public abstract DataTable ImportToDataTable()

    }

    public class Child2 : Parent
    {
        public DelimitedFileDetail InputFile = new DelimitedFileDetail();
        public string PropertyforChild1 { get; set; }
        public override DataTable ImportToDataTable() { .....code }

    }

    public class Child3 : Parent
    {
        public string PropertyforChild2 { get; set; }
        public override DataTable ImportToDataTable() { .....code }

    }

    public class DelimitedFileDetail : Child2
    {
        public string Name { get; set; }
        public ImportTypes FileType { get; set; }
        public List<FieldDefinitions> FieldList = new List<FieldDefinitions>();
    }

}
  

Комментарии:

1. «Я не вижу никаких свойств в дочернем классе» — что именно означает? Где их увидеть? Как? Где вы пытаетесь их увидеть и что конкретно происходит, когда вы не можете? Скорее всего, вам просто нужно вернуться и прочитать документацию о том, как работают члены класса, но даже невозможно узнать, какую часть документации вам нужно прочитать, потому что неясно, что вы пытались сделать и каким образом это не сработало.

Ответ №1:

Вы должны определить свой родительский класс как интерфейс, а не абстрактный класс или базовый класс, если на то пошло

Таким образом, ваши дочерние классы могут реализовать интерфейс. Затем вы должны использовать переменную интерфейса для ссылки на дочерние классы / реализации.

Есть ли причина, по которой вы определили родительский класс как абстрактный класс? Интерфейс должен работать, поскольку вы все равно не реализовали никаких абстрактных членов

Ответ №2:

Ну, когда вы объявляете переменную в c # с родительским типом, intelisense не покажет вам свойства дочернего класса. Если вы хотите использовать конкретные свойства дочерних элементов, вам необходимо объявить переменную с типом конкретных дочерних элементов.

Поэтому вместо того, чтобы делать:

 Parent obj = new Child2();
  

Вы должны сделать:

 Child2 obj = new Child2();
  

И так далее…

Ответ №3:

Вы не можете видеть никаких свойств дочернего класса, потому что вы сообщили компилятору, что obj это тип Parent . Если вы хотите увидеть свойства дочернего класса, вы можете привести obj его к истинному типу:

 Parent obj = new Child2();
string str = ((Child2)obj).PropertyforChild2;
  

Это, конечно, не идеальный код. В основном потому, что тогда вы должны знать, что obj это тип Child2 , и если вы это знаете, почему бы просто не указать obj тип Child2 ?