簡體   English   中英

與多個接口實現混淆

[英]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(); 
   }
}

我從名稱中推斷出很多,但它看起來好像IDeviceDataObjectIValidatableObject是不同的想法。 你可以擁有實現IDeviceDataObjectIValidatableObject或兩者的對象似乎是合理的(是嗎?)。 如果這是真的,那么兩個接口之間就沒有“是一個”關系(你不會認為IDeviceDataObject是一個IValidatableObject ),所以從另一個繼承一個接口似乎是錯誤的。

對於您的ValidateDevice方法(或任何方法) - 如果它將使用該參數作為IDeviceDataObject ,則該參數應該是該類型。 如果它將使用參數作為IValidatableObject ,則參數應該是類型。 如果它可能使用這兩種功能,您可能希望傳入一個不太具體的類型,然后進行運行時檢查(使用C#'is'或'as')來查看該對象是否支持特定接口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM