【发布时间】:2011-09-15 01:11:34
【问题描述】:
我有以下一组接口和类。
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)?这不是表达验证方法的功能吗:它需要可验证的东西。其他一切都可以保持原样。 -
公平通话。但是,如果它是一个 CreateDevice 方法,它需要知道它是一个传入的 IDeviceDataObject 但它仍然需要具有 IValidatableObject 功能?
-
所以 - 因为我不知道这里的大局 - 所有 IDeviceDataObjects 都应该是可验证的吗?如果是,让
IDeviceDataObject继承自IValidatableObject。如果不是,那么这不是解决方案。有时真的很简单:这只是语义上有意义的问题。然后将其依次转换为代码是一个相当简单的步骤。
标签: c# oop inheritance interface refactoring