我正在使用 LinqToSQL 和多层进行 ASP.Net MVC 项目。用户可以上传文件,基本上是 Excel 和 Access 文件,我的服务层将完成所有验证和其他工作。
我正在考虑实现一个名为“UploadManager”的抽象类和 2 个子类:“UploadExcel”和“UploadAccess”。一些方法对两个类都是通用的,例如“SaveFile”和“DeleteFile”。但是,其他一些方法将仅限于特定的子类,例如仅属于“UploadExcel”类的“ValidateWorksheet”。
我正在设计这样的东西:
public abstract class UploadManager
{
protected void SaveFile(string fileName)
{
//Implement
}
protected void DeleteFile(string fileName)
{
//Implement
}
}
public class UploadExcel : UploadManager
{
private bool ValidateWorksheet()
{
//Implement
}
}
public class UploadAccess : UploadManager
{
private bool ValidateSomethingAboutAccess()
{
//Implement
}
}
我也在考虑使用接口(interface)。但是,我的主要疑问是我怎么知道我必须实例化哪个子类?如果上传的文件是 Excel 文件,则为“new UploadExcel()
”,如果是 Access 文件,则为“new UploadAccess()
”。
有没有办法做到这一点?有没有更好的办法?我对此有点迷茫......
提前致谢!
最佳答案
可以做这样的事情,一个伪代码:
首先:
public abstract class UploadManager
{
public void SaveFile(string fileName){ //uploading file }
public abstract bool CanAccept(string sFileName); //abstract
protected void DeleteFile(string fileName)
{
//Implement
}
}
第二个具体实现:
public class UploadExcel : UploadManager
{
public override bool CanAccept(string sFileName) {
//if Excel file return true, else false
}
private bool ValidateWorksheet()
{
//Implement
}
}
public class UploadAccess : UploadManager
{
public override bool CanAccept(string sFileName) {
//if Access file return true, else false
}
private bool ValidateSomethingAboutAccess()
{
//Implement
}
}
代码中某处有一个集合:
List<UploadManager> managers = new List<UploadManager>{ new UploadExcel(), new UploadAccess()};
//at the time decide to send a file (sFileName):
UploadManager myUploadManager = managers.Find(manager=>{return manager.CanAccept(sFileName);});
myUploadManager.SaveFile(sFileName); //call concrete implementaiton for that specific file
该代码仅适用于 UploadManager 类型,因此您可以在任何具体实现之上为您想要的任何文件类型 uploader 创建明确的抽象层。
问候。
完成。
关于c# - 关于实例化抽象类的子类的疑问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6801119/