私は次のインターフェイスとクラスのセットを持っています。複数のインターフェイス実装との混乱
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に問題がIDeviceDataObjectがIValidatableObjectインターフェイスを実装していないため、コンパイラは()device.Validateを解決できないということです。
私の質問はIValidatableObject
をIValidatableObject
に変更することです。私はそれが良いかどうかについては少し不確実ですが、私はそれが見える方法がDeviceDataObject
でIValidatableObject
を2回実行しています.1回はValidatableObject
で、もう一度はIDeviceDataObject
です。誰も私のためにこれをクリアするのに役立つことができますか?
public interface IDeviceDataObject : IValidatableObject
{
int Id { get; set; }
string Name { get; set; }
}
なぜあなたのValidateDeviceの署名は '' public bool ValidateDevice(IValidatableObject someobj) ''のように見えませんか?検証メソッドの機能を表現するものはありません:検証可能なものが必要です。それ以外のものはそれがそのまま残ることができます。 –
フェアコール。しかし、それが渡されるIDeviceDataObjectであることを知る必要があったが、それでもIValidatableObject機能を持つ必要があったCreateDeviceメソッドの場合はどうでしょうか? – Chris
だから私はここでもっと大きな画像を知らないので、すべてのIDeviceDataObjectsを有効にする必要がありますか? yesの場合、 '' IDeviceDataObject''は '' IValidatableObject''から継承します。そうでない場合、これは解決策ではありません。それは時には本当に単純なことです。意味論的に意味をなさないことの単なる問題です。これをコードに変換することは、やや簡単なステップです。 –