[英]Confusion with multiple interface implementation
我有以下一組接口和類。
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
(即不要讓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
}
您可以簡單地轉換為IValidatableObject。
public class DeviceService
{
public bool ValidateDevice(IDeviceDataObject device)
{
IValidatableObject v = device as IValidatableObject;
if (v != null)
return device.Validate();
return false;
}
}
您可以使您的ValidateDevice
方法通用,將其留給調用者傳入實現正確接口組合的對象實例 - 這將允許您的接口保持獨立並仍然強制類型安全:
public class DeviceService
{
public bool ValidateDevice<T>(T device) where T: IDeviceDataObject, IValidatableObject
{
return device.Validate();
}
}
我從名稱中推斷出很多,但它看起來好像IDeviceDataObject
和IValidatableObject
是不同的想法。 你可以擁有實現IDeviceDataObject
, IValidatableObject
或兩者的對象似乎是合理的(是嗎?)。 如果這是真的,那么兩個接口之間就沒有“是一個”關系(你不會認為IDeviceDataObject
是一個IValidatableObject
),所以從另一個繼承一個接口似乎是錯誤的。
對於您的ValidateDevice
方法(或任何方法) - 如果它將使用該參數作為IDeviceDataObject
,則該參數應該是該類型。 如果它將使用參數作為IValidatableObject
,則參數應該是該類型。 如果它可能使用這兩種功能,您可能希望傳入一個不太具體的類型,然后進行運行時檢查(使用C#'is'或'as')來查看該對象是否支持特定接口。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.