簡體   English   中英

限制類型參數

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

像這樣定義CommandCommandHandler的地方

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.

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