让Base Class访问C#Inheritance中的Child成员

时间:2010-12-20 04:00:01

标签: c# inheritance visibility

我确定我错过了一些东西,因为C#不是我的强项而且我来自PHP背景,但我正在写一个基类(称为GVProgram),它将由子类继承(ProgramA) ,ProgramB)。我有以下内容:

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看到ProgramA中设置的name成员?

课程的实施代码

在我的表格课上,我有:

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.progAprog本身。

this.progA显示namepath在基础prog中设置显示namepath在prog本身中设置,和[ProgramA] - > base。调用堆栈显示> Program.exe!MyNamespace.GVProgram.isRunning() Line 28

我更改了isRunning以使用this.name而不仅仅是name。当我第二次进入这个功能时,我把手表放在this上。它也表明namepath已正确填写。

导致什么 它实际上最终成为ProgramB的构造函数。它花了第二个参数,重载的构造函数没有设置名称。这就是我午夜后编码所得到的。感谢大家的帮助!

2 个答案:

答案 0 :(得分:2)

我猜你实例化了错误的类。添加课程后,我写了两个程序。

这个失败,引用空引用异常

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 :(得分:1)

我建议你让GVProgram类'抽象'。它可能会揭示错误(或至少有助于防止将来出现类似错误)。