C # - Наследование, переопределение - PullRequest
2 голосов
/ 23 сентября 2011

Могу ли я сделать что-то подобное? (Слишком упрощенный, потому что он слишком сложный)

abstract class A {
  public string Print() {}

  public static string DoPrint(A a, Type T) {
    ((T)a).Print(); // <-- This should call eg. A3.Print(), not A.Print()
  }
}

class A1: A {
  public new string Print() {}
}

class A2: A {

}

class A3: A {
  public new string Print() {}
}

class Somewhere
{
  A3 a3 = new A3();
  a3.DoPrint();
}

У меня есть много классов (A1, A2, A3 и т. Д.), Которые наследуются от базового класса (A)

Я пытаюсь создать функцию DoPrint () выше в классе А. Можно ли это сделать?

Я пробовал это

  public static string DoPrint(A a) {
    a.Print();
  }

но он вызывает A.Print (), а не A3.Print ()

РЕДАКТИРОВАТЬ: изменил заголовок с "Передать тип в качестве параметра?" потому что все были правы, я мог просто использовать виртуальный (спасибо!). Проблема заключалась в другом месте, не относящемся к этому вопросу.

Ответы [ 5 ]

3 голосов
/ 23 сентября 2011
public static string DoPrint(A a) {
  a.Print();
}

будет работать, но вам нужно объявить Print как виртуальный и переопределить его.

    abstract class A {
      public virtual string Print() {}

      public static string DoPrint(A a) {
          a.Print();
      }
    }

    class A1: A {
      public override string Print() {}
    }

    class A2: A {
      public override string Print() {}
    }

    class A3: A {
      public override string Print() {}
    }

    class Somewhere
    {
      A3 a3 = new A3();
      A.DoPrint(a3);
    }
2 голосов
/ 23 сентября 2011

Вместо использования new отметьте метод Print базового класса как виртуальный, а затем используйте переопределение в объявлениях метода подклассов.

public virtual string Print() { }

А в подклассах:

public override string Print() { }
1 голос
/ 23 сентября 2011

DoPrint() - статическая функция.

Вы должны назвать это так:

A3.DoPrint(a3, typeof(A3));

или

A3.DoPrint(a3, a3.GetType());

Теперь я не понимаю, почему вы хотите это сделать. Почему бы просто не иметь виртуальный Print() в классе A и переопределить его в производных классах?

1 голос
/ 23 сентября 2011

Что не так с обычными виртуальными методами и наследованием ?? Посмотрите на использование виртуального и переопределения:

abstract class A { 
 public virtual string Print() {} 

  public static string DoPrint(A a) { 
     a.Print(); // <-- This WILL call eg. A3.Print(), not A.Print() 
  } 
} 

class A1 : A
{
    public override string Print() {}
}

class A2 : A
{
    public override string Print() {}
}
class A3 : A
{
    public override string Print() {}
}
1 голос
/ 23 сентября 2011

В основном нет.Ты не можешьЕсли вы не перейдете на уровень отражения и не найдете и не вызовете метод Print, определенный в T, через него.Что-то вроде интерфейсов или dynamic выберет реализацию самый верхний .

Однако мне интересно, должно ли Print() здесь быть virtual:

abstract class A {
  public abstract string Print();
}

class A1: A {
  public override string Print() {}
}

class A2: A {
  public override string Print() {}
}

class A3: A {
  public override string Print() {}
}

и просто позвоните a.Print();.Затем полиморфизм вызовет наиболее производное переопределение Print().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...