上下文類:使用實現接口
我想有兩個庫 - 一個是傳統的一個使用現有的實現和兩個是一些與驗證等過程的一個更精簡的版本。另外,要長期清除多餘的數據。
我在非傳統圖書館兩個接口:
public interface IMyAttribute
{
int Id { get; set; }
dynamic Value { get; set; } // if Value can be of different types, is there a better way?
bool IsValid();
}
public IMyData
{
List<IMyAttribute> data { get; set; };
void SetProperties();
bool IsValid();
}
我設置了傳統圖書館參考「新」庫。對於IMyAttribute的傳統實現,IsValid返回true,因爲目前沒有現有的驗證。這將從表中提取數據,該表將具有AttributeValue,AttributeValueNumber或AttributeValueDate字段集,並應相應地執行(string,double,DateTime),因此使用動態Value。對於IMyData的傳統實現,我已經向對象添加了屬性,並且SetProperties設置了該實例的屬性。
我的問題是,我基本上鍊接到它似乎的接口。或者說,我試圖這樣做,我似乎只能鏈接到界面。我的目標是「我將擁有這些參數和這些回報的方法,或多或少」。但我想這樣做,遇到了問題:
public class MyLegacyAttribute : IMyAttribute
{
//implementing items from interface plus other methods and properties
}
public class MyLegacyData : IMyData
{
...
List<MyLegacyAttribute> data { get; set; }
...
}
有沒有做這種方式,它可將合同性質還是我處理它不正確的方法是什麼?我試圖修改IMyData到:
List<T> data where T : IMyAttribute { get; set; }
List<T> data { get; set; } where T : IMyAttribute // didn't think this would work, but gave it a shot.
無濟於事。
對不起,我沒有指出問題(我試圖更好地實現接口等與野生西部一切)如此表達,雖然嘗試嘗試,但感覺有點困難。這就是說,「如果你可以讓IMyData成爲一個通用的接口...」,並且基本上是我試圖做的東西。並且感謝您爲接口和泛型提供了大量的燈光,因爲它將它們帶到一起。 – Robert
我有這樣一個問題:如果我有MyIntegerAttribute(MIA),MyStringAttribute(MSA)和MyDateTimeAttribute(MDTA)全部實現IMyAttribute(T分別爲int,string和DateTime),有沒有辦法單個MyLegacyData其中Data屬性是各種MIA,MSA和MDTA的集合?或者我應該回到之前提到的對象值(儘管這會影響將來的核心數據類型的任何比較邏輯等)? –
Robert
@Robert:你不能混合/匹配不同類型而不刪除類型。有很多種方法可以做到這一點,但並非所有這些方法都需要放棄通用的'IMyAttribute'類型,但至少「IMyData」實現將不得不放棄類型信息。例如,如果你可以'IMyAttribute '爲只讀,這樣'Value'屬性只有一個getter,那麼泛型類型方差將允許'MyLegacyData ,object >>'即使單個項目在事實更具體。否則,你將不得不犧牲某種類型的安全性。 –