#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
?