【问题标题】:overloading on basis of return type only仅基于返回类型重载
【发布时间】:2009-09-02 06:38:22
【问题描述】:

我有一种情况,我想从此函数返回 List

public DataTable GetSubCategoriesBySubCatID(Guid SubCategoryID)

所以我想要的是

public List<SubCategories> GetSubCategoriesBySubCatID(Guid SubCategoryID)

我知道仅基于返回类型不支持重载,我只是不想在两个函数中重复相同的代码。

在不影响适用于第一个函数的引用的情况下实现此目标的最佳方法是什么

【问题讨论】:

  • 旁注:返回值绝不是方法签名的一部分,因为您可以决定调用方法而不对结果做任何事情。例如:GetSubCategoriesBySubCatID(guid);

标签: c# overloading


【解决方案1】:

给他们起不同的名字:

public DataTable GetSubCategoryTableBySubCatID(Guid subCatID)

public List<SubCategory> GetSubCategoryListBySubCatID(Guid subCatID)

除此之外,这将使您在阅读调用代码时更清楚您对哪种方法感兴趣。

如果这些应该以通用方式实现,请编写一个包含通用核心的私有方法,并从两个公共方法中调用它。例如,您可以使用委托来执行“我找到了一个结果,将其添加到您的集合”部分,或者使用迭代器块:

// "action" will be called on each sub-category
private void FindSubCategoriesBySubCatID(Guid subCatID,
                                         Action<SubCategory> action)

private IEnumerable<SubCategory> FindSubCategoriesBySubCatID(Guid subCatID)

【讨论】:

  • @jon- 如果我通过使用反射将此数据表转换为列表 会公平吗?这会降低性能吗?
  • 反射总是涉及性能损失。惩罚的严重程度将取决于您的具体操作。
【解决方案2】:

使用如下泛型。

    public T GetSubCategoriesBySubCatID<T>(Guid SubCategoryID)
    {
        T value = ...;
        return value;
    }

【讨论】:

  • 这是开放的以获得“汽车”类型的类别?
  • @yapiskan - 不确定我是否理解?你指的是类型约束吗?
【解决方案3】:

我会定义

public IEnumerable<SubCategories> GetSubCategoriesBySubCatID(Guid SubCategoryID);

该方法的实现类可以随意使用任何实现了IEnumerable{SubCategories}的集合或容器

【讨论】:

    【解决方案4】:

    可以做到,就是这样

    正如许多人已经解释过的,C# 不支持返回类型重载。事实上它是由 CTS 支持的。但是,如果您的应用程序中的场景绝对需要使用接口,我们可以使用显式接口实现来模拟返回类型方法重载

    我们可以定义两个具有相同方法签名但返回类型不同的接口,例如

    Interface I1
    {
        DataTable GetSubCategoriesBySubCatID(Guid SubCategoryID);
    }
    
    Interface I2
    {
        List<SubCategories> GetSubCategoriesBySubCatID(Guid SubCategoryID);
    }
    

    我们定义了实现这两个接口的类

    public class CategoryFinder:I1, I2
    {
         public DataTable GetSubCategoriesBySubCatID(Guid SubCategoryID) //Implicitly implementing interface 
         {   
              //processing
              return _dt; 
         }
    
    
         List<SubCategories> I2.GetSubCategoriesBySubCatID(Guid SubCategoryID) //explicit implementing interface
         {
               //processing
               return _list<>
         }
    }
    

    由于 CategoryFinder 类同时实现了相互冲突的 GetSubCategoriesBySubCatID,我们将不得不显式地对接口进行类型转换,如下所示

    CategoryFinder cf = new CategoryFinder();
    cf.GetSubCategoriesBySubCatID(Guid SubCategoryID); // will call the implicit return type which is data table
    ((I1)cf).GetSubCategoriesBySubCatID(Guid SubCategoryID); // will return **I1** implementation i.e datatable
    ((I2)cf).GetSubCategoriesBySubCatID(Guid SubCategoryID); // will return **I2** implementation i.e list
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-21
      • 2021-11-10
      • 2019-10-29
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多