[英]Restricting type parameters
在Java中,我可以指定傳遞給此類方法的類型的界限
public <C extends Command, CH extends CommandHandler<C>> void
registerCommandHandler(Class<C> command, Class<CH> handler) {
System.out.println("command class is " + command.getCanonicalName());
Object instance = handler.newInstance();
:
}
像這樣定義Command和CommandHandler的地方
class Command {}
abstract class CommandHandler<C extends Command> {
public abstract void handle(C command);
}
這種通用的構造使Java編譯器強制命令和命令處理程序始終相互匹配。 因此,以下示例將編譯得很好
registerCommandHandler(CreateCustomerCommand.class, CreateCustomerCommandHandler.class);
但這不會編譯
registerCommandHandler(CreateCustomerCommand.class, DeleteCustomerCommandHandler.class);
是否可以在C#中創建類似的類型安全構造,使我在編譯時可以限制傳遞給函數的類型的范圍?
嘗試:
public void registerCommandHandler<C, CH>(C command, CH handler)
where C : Command
where CH : CommandHandler<C>
{
// other C# code here
}
閱讀您的評論后,我認為您需要這樣的內容:
public void registerCommandHandler<C, CH>()
where C : new()
where CH : new()
where C : Command
where CH : CommandHandler<C>
{
C instanceOfC = new C();
CH instanceOfCH = new CH();
}
您可以限制或定義類型T,C或CH或在where T : SomeType
...
例如,如果您具有這兩個接口(或抽象類或其他任何類...)
public interface ICommand
{
}
public interface ICommandHandler<T> where T : ICommand
{
}
您可以在方法中限制兩個參數必須匹配...
public void registerCommandHandler<C, CH>(C command, CH handler)
where C : ICommand
where CH : ICommandHandler<C>
{
}
您不必為此而定義接口,僅是一個示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.