c# - 关于实例化抽象类的子类的疑问

标签 c# asp.net-mvc-2 inheritance interface abstract-class

我正在使用 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/

相关文章:

c# - Entity Framework :Why the collection type of entity class need to be instanced in the default constructor?

c# - 自定义 Asp.Net Identity 3.0

c++ - 传递给另一个对象后如何访问自定义类型?

c# - 查看有很多组件。多个模型对象?

c# - ASP.NET MVC 2 验证选择列表

java - 在Java中如何使用接受其父类的单个函数处理所有子类

c++ - C++多类问题中的继承

c# - 将文件名(字符串参数)从子窗口传递到父窗口的非静态方法

c# - 根据数据库中的另一个文本框填充文本框值

c# - string.IsNullOrEmpty(string)' 有一些无效参数