New*_*arp 15 .net c# inheritance extension-methods
我是C#的新手,我正在尝试理解基本概念.预先感谢您的帮助.我在下面有一些示例类(在此窗口中键入以便可能存在一些错误)并且有两个问题:
是否可以调用以相同名称执行基类方法中的代码的派生类方法,然后在派生类方法中执行代码?每个派生类都需要为RunCheck执行基类代码,然后执行特定于其类的专用代码.我可以在基类中命名RunCheck(),然后在调用派生类的RunCheck()时调用它,但是我必须记得在派生类的RunCheck()上调用它.
在Program.cs中,我想输出一个空值的所有字段,如果它在一个不在我传入的派生类中的字段上.我会传入什么?
这是我的代码:
class baseCheck
{
public DateTime StartTime { get; set; }
public DateTime LastRun { get; set; }
public int Runs { get; set; }
//Others
public void RunCheck()
{
if (Started != null)
started = DateTime.Now;
LastRun = DateTime.Now;
Runs++;
}
}
class FileCheck : baseCheck
{
public string FileName { get; set; }
public void RunCheck()
{
//I want all the code in the base class to run plus
//any code I put here when calling this class method
}
}
class DirectoryCheck : baseCheck
{
public string DirectoryName { get; set; }
public void RunCheck()
{
//I want all the code in the base class to run plus
//any code I put here when calling this class method
}
}
//Program.cs
static void Main()
{
//Create derived class - either DirectoryCheck or FileCheck
//depending on what the user chooses.
if (Console.ReadLine()=="F")
{
FileCheck c = new FileCheck();
}
else
{
DirectoryCheck c = new DirectoryCheck();
}
PrintOutput(c);
}
private void PrintOut(What do I put here?)
{
Console.WriteLine("Started: {0}",f.StartTime)
Console.WriteLine("Directory: {0}", f.DirectoryName)
Console.WriteLine("File: {0}", f.FileName}
}
Run Code Online (Sandbox Code Playgroud)
Bro*_*ass 28
只需打电话给base.RunCheck()你的DirectoryCheck班级:
public class DirectoryCheck : baseCheck
{
public string DirectoryName { get; set; }
public void RunCheck()
{
//I want all the code in the base class to run plus
//any code I put here when calling this class method
base.RunCheck();
Console.WriteLine("From DirectoryCheck");
}
}
Run Code Online (Sandbox Code Playgroud)
另外,对于当前的实现,您隐藏了基类RunCheck()方法 - 您应该实际覆盖它 - 这会将基类中的方法签名更改为
public virtual void RunCheck()
Run Code Online (Sandbox Code Playgroud)
并在派生类中
public override void RunCheck()
Run Code Online (Sandbox Code Playgroud)
我怀疑你真正想要的是非虚拟接口模式(NVI) - 在你的基类中公开一个受保护的虚方法,子类可以覆盖,但在基类上有一个实际调用该方法的公共方法内部 - 这种方法允许您扩展您在该呼叫之前和之后所做的事情.
在您的示例中,这将如下所示:
class BaseCheck
{
private DateTime Started { get; set; }
public DateTime StartTime { get; set; }
public DateTime LastRun { get; set; }
public int Runs { get; set; }
//Others
public void RunCheck()
{
if (Started != null)
Started = DateTime.Now;
LastRun = DateTime.Now;
Runs++;
CoreRun();
}
protected virtual void CoreRun()
{
}
}
public class DirectoryCheck : BaseCheck
{
public string DirectoryName { get; set; }
protected override void CoreRun()
{
//I want all the code in the base class to run plus
//any code I put here when calling this class method
Console.WriteLine("From DirectoryCheck");
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
36920 次 |
| 最近记录: |