我有以下一组接口和类。
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)
这不是表示可进行验证的方法功能的信息:它需要可验证的内容。其他所有内容都可以保持原样(例如,不要让
IDeviceDataObject
从IValidatableObject
继承,例如,您可能想表示并非每个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
}