我确定我遗漏了一些东西,因为 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 看到在 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 将 prog 转换为 GVProgram,而不是原始类,而不是像我预期的那样,只是使用 GVProgram 作为类型提示来确保传递正确的对象类型?
isRunning 上的断点
我在 if (prog.isRunning())
上添加了一个断点,并在 this.progA
和 prog
本身上添加了一个 Watch功能。
this.progA
显示 name
和 path
设置在基 prog
显示 name
和 path
设置在 prog 本身,而 [ProgramA]->base.调用堆栈显示 > Program.exe!MyNamespace.GVProgram.isRunning() Line 28
我将 isRunning 更改为使用 this.name
而不仅仅是 name
。当我第二次进入该函数时,我在 this
上放了一个 watch 。它还表明 name
和 path
已正确填写。
是什么原因造成的 它实际上最终成为 ProgramB 的构造函数。它采用了第二个参数,并且重载的构造函数没有设置名称。这就是我在午夜后编码的结果。感谢大家的帮助!
最佳答案
我猜你实例化了错误的类。添加您的类(class)后,我编写了两个程序。
这个失败并出现空引用异常
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());
}
}
关于c# - 让基类访问 C# 继承中的子成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4486774/