вызов метода дочернего класса из базового класса C #

Можно ли вызвать метод дочернего класса из ссылки на базовый класс? Пожалуйста, предложите ...

Пример кода приведен ниже:

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

public class Child1:Parent
{
    public string Child1Property { get; set; }
}
public class Child2 : Parent
{
    public string Child2Property { get; set; }
}

public class Program
{
    public void callMe()
    {
        Parent p1 = new Child1();
        Parent p2 = new Child2();

        //here p1 & p2 have access to only base class member.
        //Is it possible to call child class memeber from the base class reference based on the child class object it is referring to?
        //for example...is it possible to call as below:
        //p1.Child1Property = "hi";
        //p2.Child1Property = "hello";
    }
}
 Tisha Anand06 июн. 2016 г., 08:40
Я получаю эту проблему при реализации шаблона фабричного метода. на основе условия создается дочерний класс и присваивается ссылка на родительский класс. Но это относится только к родительским членам. Итак, как мне сделать вызов метода универсальным, который будет возвращать соответствующий объект дочернего класса на основе какого-либо условия?
 Enigmativity06 июн. 2016 г., 08:37
Только с помощью отражения или приведения базового типа к дочернему типу.

Ответы на вопрос(1)

Решение Вопроса

На самом деле вы создалиChild1 а такжеChild2 экземпляры, так что вы можетебросать им:

  Parent p1 = new Child1();
  Parent p2 = new Child2();

  // or ((Child1) p1).Child1Property = "hi";
  (p1 as Child1).Child1Property = "hi";
  (p2 as Child2).Child2Property = "hello";

Чтобы проверить, еслибросать успешно, тест дляnull:

  Child1 c1 = p1 as Child1;

  if (c1 != null)
    c1.Child1Property = "hi";

Лучший дизайн, однако, присваиваетсяChild1 а такжеChild2 локальные переменные

   Child1 p1 = Child1(); 
   p1.Child1Property = "hi"; 
 Dmitry Bychenko06 июн. 2016 г., 09:03
@ Тиша Ананд: естьнет пользы если вам нужнобросать, Но часто нам не нужно разыгрывать: все, что мы можем захотеть, скажем, правильно реализованоProperty1 (который должен бытьвиртуальный или дажеАннотация в этом случае), который объявлен вParent учебный класс.
 Tisha Anand06 июн. 2016 г., 08:59
тогда в чем выгода создания базового класса, когда в какой-то момент кода нам нужно привести родительский объект на основе того же условия, которое используется в методе фабрики?
 Tisha Anand06 июн. 2016 г., 09:12
Спасибо Dmirty :) Итак, что я понимаю ... если у дочерних классов есть ряд специфических свойств, то, кроме объявления этих свойств как родительских или виртуальных, в родительском классе, мы можем использовать оператор приведения для установки индивидуальных свойств дочернего класса. Поправьте меня, если я ошибаюсь, пожалуйста.
 Dmitry Bychenko06 июн. 2016 г., 09:20
@ Тиша Ананд: вы правы, в случае нескольких конкретных свойств вы можете использовать приведение; но слишком много приведений делают коднечитаемый и в этом случае (дочерние классыслишком разные друг от друга) вам, наверное, придется воздерживаться от заводских методов.

Ваш ответ на вопрос