C # Проверка типа дочернего класса в родительском классе. Это хорошая практика? [Дубликат]

Чтобы точно ответить на вопрос о том, как преобразовать один столбец логических значений в столбец целых чисел 1 или 0:

df.somecolumn = df.somecolumn.astype(int)

0
задан maccettura 5 July 2018 в 14:47
поделиться

2 ответа

Код в вопросе должен делать то, что вы хотите, однако, как писал Дэнни Гудбол в своем комментарии, это очень плохая практика.

Согласно принципу open / close , заявив, что «программные объекты (классы, модули, функции и т. д.) должны быть открыты для расширения, но закрыты для модификации», правильный способ обработки различных действий для разных детей использует переопределить:

Сделать метод виртуальным (может быть еще лучше, как абстрактный метод) и переопределить его в каждом производном классе с его собственной реализацией:

class A
{
     virtual void CheckDerived() { throw new NotImplementedException(); }
}

class A0 : A
{
     void override CheckDerived() { Console.WriteLine("A0"); }
}

class A1 : A
{
     void override CheckDerived() { Console.WriteLine("A1"); }
}
2
ответ дан Zohar Peled 15 August 2018 в 22:33
поделиться
  • 1
    В то время как ответ @mostafa работает тоже для того, что мне нужно (трудно объяснить, так как английский не является моим первым языком), я выбираю это как правильный ответ за правильную практику. – Imacisco 5 July 2018 в 15:14

вы должны сделать это, используя типы классов и метод IsAssignableFrom

  public class Program
{
public static void Main()
{
    A a = new A0();
    a.CheckDerived();

 }
}

class A0 : A {};
class A1 : A {};
class A2 : A {};
class A {
public void CheckDerived() {
    if(this.GetType().IsAssignableFrom(typeof(A0))) Console.Write("A0");
    if(this.GetType().IsAssignableFrom(typeof(A1))) Console.Write("A1");
    if(this.GetType().IsAssignableFrom(typeof(A2))) Console.Write("A2");
}
}
-1
ответ дан mostafa 15 August 2018 в 22:33
поделиться
  • 1
    Нет, вы никогда не должны этого делать. – HimBromBeere 5 July 2018 в 14:50
  • 2
    @HimBromBeere, почему? – mostafa 5 July 2018 в 14:52
  • 3
    Потому что вы вводите жесткие зависимости. Что делать, если детей больше, чем A0-2? Что делать, если я хочу уйти с A1 и удалить его из базы кода? Что делать, если я хочу добавить A3? Что делать, если сотрудник хочет добавить A3 ... Кроме того, вы определяете поведение детей внутри родителя ... Я мог бы продолжать и продолжать ... Открывать / закрывать ... Тестирование. .. – Fildor 5 July 2018 в 14:56
  • 4
    – mostafa 5 July 2018 в 15:01
  • 5
    Читайте комментарии ... он пытается определить ответы в зависимости от производного типа. - Это как раз прецедент для переопределения. – Fildor 5 July 2018 в 15:02
Другие вопросы по тегам:

Похожие вопросы: