2016-12-01 6 views
0

Я читаю какой-то код, не могли бы вы объяснить, что делает нижняя строка?Как можно вызвать метод интерфейса напрямую?

bool isFeatureEnabled = FeatureControl.Current.Features.AppDesigner.IsEnabled(organizationId,currentOrgDBVersion); 

Вот определения кода выше

public sealed class FeatureControl : IFeatureControl 
{ 
    public static IFeatureControl Current { get; } 
    [XmlIgnore] 
    public IFeatureDetailContainer Features { get; set; } 
    .... 
} 


public interface IFeatureControl 
{ 
    IFeatureDetailContainer Features { get; set; } 
    ... 
} 


public interface IFeatureDetailContainer 
{ 
    IFeatureDetail AppDesigner { get; } 
} 

public interface IFeatureDetail 
{ 
    bool IsEnabled(Guid organizationId, Version currentOrgDBVersion); 
} 

Я не вижу каких-либо экземпляров, созданных, как это работает?

К сожалению, я скопировал метаданные, я только что нашел фактический код:

public sealed class FeatureControl : IFeatureControl 
{ 

    private static readonly Lazy<IFeatureControl> current = new Lazy<IFeatureControl>(() => new FeatureControl()); 
    private IFeatureDetailContainer features; 
    public static IFeatureControl Current 
     { 
      get 
      { 
       return current.Value; 
      } 
     } 

    /// <summary> 
     /// Accessor to the Features List for Developers to retrieve the information 
     /// </summary> 
     [XmlIgnore] 
     public IFeatureDetailContainer Features 
     { 
      get 
      { 
       return this.features; 
      } 
      set 
      { 
       this.features = value; 
      } 
     } 
} 
+2

Как мы узнаем, что экземпляр не создан в коде, который вы пропустили? – nos

+0

'Current' помечен как' static' в 'FeatureControl.Current'. Таким образом, экземпляр может быть создан и назначен в любой части вашего другого кода. – Aruna

+0

Возможно, вы можете проверить ** стек вызовов ** –

ответ

0

Это паттерн синглтон. Обычно экземпляр создается внутри конструктора.

public interface IFeatureControl { } 
public sealed class FeatureControl : IFeatureControl 
{ 
    public static IFeatureControl Current { get; } 

    static FeatureControl() 
    { 
     if (Current == null) 
     { 
      Current = new FeatureControl(); 
     } 
    } 
} 

[TestFixture] 
public class FeatureControlTests 
{ 
    [Test] 
    public void IsFeatureControlSingleton() 
    { 
     IFeatureControl c1 = FeatureControl.Current; 
     IFeatureControl c2 = FeatureControl.Current; 
     Assert.AreSame(c1, c2); 
    } 
} 
0

В какой-то момент в коде (не показано), вы можете ожидать объекта IFeatureControl :: Текущий создается/new'd.

Ваша строка кода просто обращается к этому значению. Обратите внимание: если вы запустите код без фактического создания объекта Текущий, вы получите нулевой номер. ошибка.

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

Рассмотрите возможность использования интерфейсов в этом примере, чтобы описать, как все будет организовано и как они будут работать. Однако это всего лишь контур, и вам нужно будет покрасить внутри линий, чтобы добиться результата. Удачи!