2017-02-14 34 views
0

Я пытаюсь создать объект, который содержит вызов определенного метода в каком-то другом классе. Вы должны иметь возможность вызвать вызов этого метода из экземпляра объекта. Насколько мне удалось выяснить, способ сделать это будет делегатом. Так это правильный способ обойти это? Развертывание метода из класса, который вы хотите использовать в качестве делегата, а затем настроить свой объект следующим образом?Как создать объект, конструктор которого принимает метод из другого класса?

public class ItemCombination 
{ 
    public ItemCombination(string Item1, string Item2, Delegate interaction) 
    { 
     this.Item1 = Item1; 
     this.Item2 = Item2; 
     this.interaction = interaction; 
    } 

    public string Item1 { get; set; } 
    public string Item2 { get; set; } 
    public Delegate interaction { get; set; } 

    public void Interact() 
    { 
     interaction(); 
    } 
} 
+5

Передача обратного вызова - это, безусловно, законный способ внедрения функциональности. Однако я бы предложил типизированный обратный вызов (для ясности, например Action, Func и т. Д.). – Eric

ответ

1

Это именно то, что делегаты для, однако, как уже упоминалось в комментариях, вы должны использовать набранный делегатов, т.е. System.Action<T...> если делегат имеет тип void возврата или Func<T..., R>, если он возвращает экземпляр R. Ваш пример будет выглядеть так:

public class ItemCombination 
{ 
    public ItemCombination(string Item1, string Item2, Action interaction) 
    { 
     this.Item1 = Item1; 
     this.Item2 = Item2; 
     this.interaction = interaction; 
    } 

    public string Item1 { get; set; } 
    public string Item2 { get; set; } 
    public Action Interaction { get; set; } 

    public void Interact() 
    { 
     // safeguard against null delegate 
     Interaction?.Invoke(); 
    } 
} 
+0

Ах, понял. И вы могли бы даже напрямую вызывать из публичного поля «Взаимодействие» вместо того, чтобы делать метод специально для этого? – PPFY

+1

Несомненно, это зависит от того, сколько вы хотите инкапсулировать и защитить свой API. Например. вы можете иметь реализацию по умолчанию, которую вы либо устанавливаете в конструкторе, если аргумент 'взаимодействия' равен« null », или, наоборот, вы вызываете его внутри вашей оболочки« Interact() », если делегат« null ». –