代码之家  ›  专栏  ›  技术社区  ›  Ross Bush

如何使用重写的方法参数

  •  0
  • Ross Bush  · 技术社区  · 7 年前

    BusinessClass 以接口作为强制方式的后代 Fetch_Data .

    BusinessBase 会实现它自己的 获取数据 通过重写。我已经让它大部分工作了,但是,您不能使用从虚拟版本中使用的类中降序的参数重写方法,方法签名不同,编译器将不允许它。

    public class BusinessLayerBaseNoCSLA<T>
    {
        public virtual void Fetch_Data(BaseParameters parameters){ throw new NotWellConfiguredException();
    }
    

    扩展BusinessLayerBase:

    public class Vehicle : BusinessLayerBaseNoCSLA<Vehicle>
    {
        public int VehicleId { get; set; }
    
        public override void Fetch_Data(GetVehicleParameters parameters)//<--This line has a red squiggly because of the signature difference, no suitable method found to override.
        {
            //I could cast like  var p = (GetVehicleParameters)BaseParameters; here but something smells bad about that  
            GetVehicleParameters p = parameters;
            ... 
            VehicleId = p.VehicleId;
        }
    }
    

    DataPortal Fetch

    public static class DataPortal
    {
        public static T FetchData<T>(object criteria) where T : BusinessLayerBaseNoCSLA<T>, new()
        {
            var result = new T();
            result.Fetch_Data((BaseParameters)criteria);
            return result;
        }
    }
    

    var Vehicle = DataPortal.FetchData<Vehicle>(new GetVehicleParameters({ VehicleId =1 });
    
    0 回复  |  直到 7 年前
        1
  •  1
  •   Steve Wong    7 年前

    如果您希望将特定类型的参数 Fetch_Data(BaseParameters parameters) 方法,可以将获取参数作为泛型类型引入基类。

    public class BusinessLayerBaseNoCSLA<TObject, TParameters>
        where TObject : BusinessLayerBaseNoCSLA<TObject, TParameters> // optional
        where TParameters : BaseParameters
    {
        public virtual void Fetch_Data(TParameters parameters)
        {
            throw new NotWellConfiguredException();
        }
    }
    

    车辆定义如下:

    public class Vehicle : BusinessLayerBaseNoCSLA<Vehicle, GetVehicleParameters>
    {
        public int VehicleId { get; set; }
    
        public override void Fetch_Data(GetVehicleParameters parameters)
        {
            //I could cast like  var p = (GetVehicleParameters)BaseParameters; here but something smells bad about that  
            // Note: No need to cast 'parameters' here!
            GetVehicleParameters p = parameters;            
            VehicleId = p.VehicleId;
        }
    }
    

    public static class DataPortal
    {
        public static TObject FetchData<TObject, TParameters>(TParameters criteria) 
            where TObject : BusinessLayerBaseNoCSLA<TObject, TParameters>, new()
            where TParameters : BaseParameters
        {
            var result = new TObject();
            //result.Fetch_Data((BaseParameters)criteria);
            // Note: no need to cast criteria!
            result.Fetch_Data(criteria);
            return result;
        }
    }
    

    用法:

    Vehicle vehicle = DataPortal.FetchData<Vehicle, GetVehicleParameters>(new GetVehicleParameters() { VehicleId = 1 });
    // Note: we need to explicitly call the FetchData<,> with the correct types