我是新來的泛型實現,需要在2個問題我輸入面對具有約束的通用方法的接口的通用類:如何編寫實現定義
我有一個接口的ICommand定義爲:
public ICommand
{
List<T> Execute<T>() where T : IValidationResult;
IDomain<T> GetDO<T>() where T : IValidationResult;
}
有意將它作爲非泛型,因爲我必須添加不同命令的集合。
這個界面我希望在一個名爲PersistCommand作爲一個通用類來實現:
public PersistCommand<TDomainObj,T> : ICommand where TDomainObj : IDomain<T> where T : IValidationResult
{
private TDomainObj _domainObject;//IDomain<T> is an interface
public PersistCommand(TDomainObj TDomainObject)
{
_domainObject = TDomainObject;
}
public IDomain<T> GetDO<T>() where T : IValidationResult
{
return _domainObject as IDomain<T>;
}
public List<T> Execute<T>() where T : IValidationResult
{
//returns a list<T>
}
}
有一個泛型類背後的意圖是從類通過這些約束不幸的是不會發生這些泛型方法(不知道爲什麼?編譯時,我得到一個警告:類型參數'T'具有與來自外部類型'PersistCommand'的類型參數相同的名稱這是第一個問題。
第二個問題是: 我有不同組的命令,從中繼承的InsertCommand,DeleteCommand和UpdateCommand PersistCommand並在單獨調用Execute()方法時正常工作。
我有一個是用於多個命令的執行如圖所示的命令管理類:
public class CommandManager
{
public virtual IEnumerable<T> Perform<T>(List<ICommand> commandList)
where T : IValidationResult
{
List<T> validationResults = new List<T>();
//fire pre-intent validations
foreach (ICommand command in commandList)
{
validationResults.AddRange(command.GetDomainObject<T>().Validate(command.GetPreIntent()));
}
//fire intent validations
if (validationResults.Count == 0)
{
foreach (ICommand command in commandList)
{
validationResults.AddRange(command.Execute<T>());
}
}
//fire post-intent validations
if (validationResults.Count == 0)
{
foreach (ICommand command in commandList)
{
validationResults.AddRange(command.GetDomainObject<T>().Validate(command.GetPostIntent()));
}
}
return validationResults;
}
}
只要傳遞給命令和所述CommandManager.Perform方法的類型「T」是相同的,有用。 但是我有一種情況,其中,我們有具有不同「T」作爲類型2個域對象:
class Project : IDomain<CustomResult>//CustomResult implements IValidationResult
class Resource : IDomain<AnotherResult>//AnotherResult implements IValidationResult
當我打電話CommandManager.Perform(commandList)它拋出在
異常GetDO方法示出的消息:對象引用未設置到對象」
任何幫助或想法的一個實例來解決這個問題,將不勝感激
喜戴夫, 我試過了,但它並沒有編譯和得到的錯誤信息: PersistCommand「不實現接口成員」 ICommand.GetDO () –
Chandrasekhar
2009-10-15 13:54:59
我已經更新我的回答覆蓋了這一點,這與你如何聲明你的界面有關。我還添加了一些關於簡化整個事情的部分... HTH – 2009-10-15 14:34:01