【问题标题】:How to Override a Virtual method with Object type in the parameter如何在参数中使用 Object 类型覆盖 Virtual 方法
【发布时间】:2019-12-17 10:43:43
【问题描述】:

我想在派生类中重写 BuildFilter 方法。我有一个带有以下签名的虚拟 BuildFilter 方法

 public abstract class BaseSearchProperty <TEntity> : ISearchResultProperty<TEntity>

 {       
    public virtual List<AppliedFilter> BuildFilter(object value)
    {
        return new List<AppliedFilter>();
    }

  } 

我知道 BuildFilter 方法覆盖类型一种是string,另一种是字符串列表List&lt;string&gt;。我在派生类中编写了覆盖方法,如下所示

public class IndustrySearchProperty : BaseSearchProperty<API.ISearchResult>
{
    public override List<AppliedFilter> BuildFilter(string filterValue,)
    {
        var appliedFilters = new List<AppliedFilter>();

        return appliedFilters;
    }

    public override List<AppliedFilter> BuildFilter(List<string> filterValue)
    {
        var appliedFilters = new List<AppliedFilter>();

        return appliedFilters;
    }
}

但是我遇到了错误,比如找不到合适的方法来覆盖。我知道这个错误是父类签名和子类签名需要相同。有没有其他方法可以解决这个问题??

【问题讨论】:

    标签: c# inheritance polymorphism overriding


    【解决方案1】:

    父类签名和子类签名需要相同

    是的。没有干净的方法。

    你可以做两件事:

    1. 在被覆盖的方法中获取对象并转换为所需的任何类型或
    2. 添加新的类型参数

    像这样:

    public abstract class BaseSearchProperty <TEntity,TFilter> : ISearchResultProperty<TEntity>
    {       
        public virtual List<AppliedFilter> BuildFilter(TFilter value)
        {
            return new List<AppliedFilter>();
        }
    } 
    

    我都不推荐。这是我脑海中的代码气味,表明您没有正确使用继承。而且它可能不支持 Liskov 和其他原则。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-05
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多