我有以下一组接口和类。

public interface IValidatableObject
{
   List<string> ValidationErrors { get; }
   bool Validate();
}

public class ValidatableObject : IValidatableObject
{
   public List<string>ValidationErrors { get; }
   public bool Validate()
   {
      //dostuff
   }
}

public interface IDeviceDataObject
{
   int Id { get; set; }
   string Name { get; set; }
}

public class DeviceDataObject : ValidatableObject, IDeviceDataObject
{
   public int Id { get; set; }
   public string Name { get; set; }
}

public class DeviceService
{
   public bool ValidateDevice(IDeviceDataObject device)
   {
       return device.Validate(); // This throws a compiler error
   }
}


上面的服务操作ValidateDevice中的问题是编译器无法解析device.Validate(),因为IDeviceDataObject不实现IValidatableObject接口。

我的问题是,更改IValidatableObject以实现IValidatableObject是否正确?我不确定这是否是一个好习惯,因为我认为DeviceDataObject两次实现IValidatableObject一次-通过ValidatableObject一次通过IDeviceDataObject。谁能帮我解决这个问题?

public interface IDeviceDataObject : IValidatableObject
{
   int Id { get; set; }
   string Name { get; set; }
}

最佳答案

我在这里可能理解有些问题(并且我不了解您的类体系结构整体),但是为什么您的ValidateDevice方法不只接受可验证的对象?签名看起来像:

public bool ValidateDevice(IValidatableObject someobj)


这不是表示可进行验证的方法功能的信息:它需要可验证的内容。其他所有内容都可以保持原样(例如,不要让IDeviceDataObjectIValidatableObject继承,例如,您可能想表示并非每个devicedataobject也是有效的)

第二种方法,如果要确保ValidateDevice仅采用实现IDeviceDataObject的对象,则还可以尝试将其跨播到IValidatableObject

public bool ValidateDevice(IDeviceDataObject someobj)
{
    if(someobj is IValidatableObject)
    {
        return ((IValidatableObject)device).Validate();
    }
    return //something that makes sense if the device is not validatable
}

07-28 04:46