Наличие базового класса для доступа к дочерним элементам в C # Inheritance - PullRequest
2 голосов
/ 20 декабря 2010

Я уверен, что что-то упустил, поскольку C # не является моей сильной стороной, и я пришел из PHP-фона, но я пишу базовый класс (называемый GVProgram), который будет наследоваться дочерними классами (ProgramAПрограммаB).У меня есть следующее:

public class GVProgram {
    public string path {get; set;}
    public string name {get; set;}
    public GVProgram(string progpath) {
        path = progpath;
    }
    public Boolean isRunning() {
        return Process.GetProcesses().Any(prc => prc.ProcessName.Contains(name));
    }
}

public class ProgramA : GVProgram {
    public ProgramA(string progpath):base(progpath) {
        name = "Program A";
    }
}

Когда я звоню ProgramA.isRunning(), отладчик всегда жалуется, что name равно нулю.Как мне заставить GVProgram увидеть элемент name, который установлен внутри ProgramA?

Код объявления для классов

В моем классе формы есть:

private ProgramA progA;
private ProgramB progB;

Когда форма загружается, я звоню:

this.progA = new ProgramA("C:\path\to\program");
this.progB = new ProgramB("C:\some\other\path");

Фактический код для вызова функции isRunning () заключается в следующем, что может быть проблемой (хотя я не уверен, какобойти его, если он есть):

private void refreshProgramAButton_Click(object sender, EventArgs e)
{
    checkProgramStatus(this.progA, this.programALabel, this.refreshProgramAButton);
}

protected void checkProgramStatus(GVProgram prog, Label label, Button button)
{
    if (prog.isRunning())
    {
        ...
    }
}

Правильно ли я считаю, что checkProgramStatus вызывает прогу как GVProgram, а не как исходный класс и не, как я ожидал, просто используя GVProgram в качестве подсказки типаубедитесь, что передается правильный тип объекта?

Точки останова на isRunning

Я добавил точку останова к if (prog.isRunning()) и добавил Watch к this.progA и prog сама по функции.

this.progA показывает, что name и path установлены в базе prog показывает, что name и path установлены в самой проге, и[Programa] -> базы.Стек вызовов показывает> Program.exe!MyNamespace.GVProgram.isRunning() Line 28

Я изменил isRunning, чтобы использовать this.name вместо просто name.Когда я вошел в функцию во второй раз, я надел часы this.Он также показал, что name и path были правильно заполнены.

Что вызвало это На самом деле он оказался конструктором для ProgramB.Требуется второй параметр, и перегруженный конструктор не устанавливает имя.Вот что я получаю за кодирование после полуночи.Спасибо всем за помощь!

Ответы [ 2 ]

2 голосов
/ 20 декабря 2010

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

Эта ошибка завершается с исключением нулевой ссылки

class Program
    {
        static void Main(string[] args)
        {

            GVProgram prog = new GVProgram();
            Console.WriteLine(prog.isRunning());
        }
    }

Этот нет.

  class Program
    {
        static void Main(string[] args)
        {

            ProgramA prog = new ProgramA("foo");
            Console.WriteLine(prog.isRunning());
        }
    }
1 голос
/ 20 декабря 2010

Я предлагаю вам сделать класс GVProgram «абстрактным».Это может выявить ошибку (или, по крайней мере, помочь предотвратить подобные ошибки в будущем).

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