как вызвать производную функцию, используя объект базового класса - PullRequest
3 голосов
/ 18 августа 2011
class Parent
{
    public int GetNo()
    {
        return 1;
    }
}

class Child : Parent
{        
    public Child()
    {

    }

    public int GetNo()
    {                       
        return 2;
    }
}

Parent p = new Child();
p.GetNo();

Но это звонит Base.GetNo(). Я знаю, если я буду использовать virutal в базе, это вызовет Child.GetNo() Но я не могу использовать virutal в Base, потому что мне нужно извлечь мой класс из базы, которая уже распределена в DLL. Так что нет способа изменить существующие функции базового класса.

Любые предложения оцениваются. Спасибо

Ответы [ 4 ]

6 голосов
/ 18 августа 2011

Вы можете разыграть его:

((Child)p).GetNo();

или

if(p is Child)
    (p as Child).GetNo();
0 голосов
/ 25 ноября 2016

Я только что пришел сюда, чтобы найти решение, которое не использует приведения, но поскольку я не нашел его, вот оно.

Возможно, оно может кому-то помочь.

abstract class Parent
{
    public int GetNo()
    {
        return GetNoImpl();
    }

    protected abstract int GetNoImpl();

}

class Child : Parent
{        
    public Child()
    {

    }

    protected override int GetNoImpl();
    {                       
        return 2;
    }
}

Parent p = new Child();
p.GetNo();

Примечание: родительский класс является абстрактным.

0 голосов
/ 18 августа 2011

Если в методе не объявлено virtual, базовый метод будет вызываться всегда, потому что вы объявили свою переменную как Parent. Если вы не можете добавить virtual к базовому классу, вы можете только объявить переменную как Child или привести ее к Child и вызвать метод GetNo:

Child p = new Child();
p.GetNo();

Или:

Parent p = new Child();
((Child)p).GetNo();
0 голосов
/ 18 августа 2011

Вы можете форсировать это явным приведением, например,

((Child)p).GetNo();

Или вы можете использовать скрытие, например,

public new int GetNo()
{
  return 2;
}

Хотя я думаю, что последний вызывается, только если переменная введена вкласс, который скрывает метод.

Если вам действительно нужно правильно переопределить метод, и он из скомпилированной DLL, подумайте о том, чтобы связаться с разработчиками, чтобы узнать, могут ли они сделать метод виртуальным (и если нет, то почему)или если проект с открытым исходным кодом, просто получите исходный код и измените его самостоятельно.

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