我确定我错过了一些东西,因为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.progA
和prog
本身。
this.progA
显示name
和path
在基础prog
中设置显示name
和path
在prog本身中设置,和[ProgramA] - > base。调用堆栈显示> Program.exe!MyNamespace.GVProgram.isRunning() Line 28
我更改了isRunning以使用this.name
而不仅仅是name
。当我第二次进入这个功能时,我把手表放在this
上。它也表明name
和path
已正确填写。
导致什么 它实际上最终成为ProgramB的构造函数。它花了第二个参数,重载的构造函数没有设置名称。这就是我午夜后编码所得到的。感谢大家的帮助!
答案 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类'抽象'。它可能会揭示错误(或至少有助于防止将来出现类似错误)。