In C #, l’interfaccia può essere istanziata?

Sto leggendo il codice qui . Trovo che private ITreeModel _model; in TreeList.cs:

 namespace Aga.Controls.Tree { public class TreeList: ListView { #region Properties //... private ITreeModel _model; public ITreeModel Model { //... } //... } } 

e ITreeModel è un’interfaccia in ITreeModel.cs:

 namespace Aga.Controls.Tree { public interface ITreeModel { ///  /// Get list of children of the specified parent ///  IEnumerable GetChildren(object parent); ///  /// returns wheather specified parent has any children or not. ///  bool HasChildren(object parent); } } 

il _model è un object istanziato?

Modificato :

TreeList.cs :

 namespace Aga.Controls.Tree { public class TreeList: ListView { #region Properties ///  /// Internal collection of rows representing visible nodes, actually displayed in the ListView ///  internal ObservableCollectionAdv Rows { get; private set; } private ITreeModel _model; public ITreeModel Model { get { return _model; } set { if (_model != value) { _model = value; _root.Children.Clear(); Rows.Clear(); CreateChildrenNodes(_root); } } } private TreeNode _root; internal TreeNode Root { get { return _root; } } //.... } } 

}

Modificato2 :

Da qualche parte:

 public partial class RegistrySample : UserControl { public RegistrySample() { InitializeComponent(); _tree.Model = new RegistryModel(); } } 

class RegistryModel : ITreeModel

Ovviamente puoi farlo, ma l’object sottostante deve implementare questa interfaccia. Quindi puoi fare qualcosa del genere

 ITreeModel _model = new TreeModel(); 

Dove

 public class TreeModel:ITreeModel { ... } 

È implementato da qualche altra parte nel codice. Se chiami _model.GetType().ToString() vedrai che non è solo un’interfaccia.

Ma per rispondere correttamente alla tua domanda, SI, un’interfaccia può essere istanziata. Alcuni di voi potrebbero pensare “no, non può”, ma può essere fatto (con alcuni hack COM):

 class Foo : IFoo { readonly string name; public Foo(string name) { this.name = name; } string IFoo.Message { get { return "Hello from " + name; } } } // these attributes make it work // (the guid is purely random) [ComImport, CoClass(typeof(Foo))] [Guid("d60908eb-fd5a-4d3c-9392-8646fcd1edce")] interface IFoo { string Message {get;} } //and then somewhere else: IFoo foo = new IFoo(); //no errors! 

Ecco la mia fonte.

Quella _model dovrebbe contenere un’istanza di una class che implementa quell’interfaccia ITreeModel (o è null ).

Da Interfaces (C# Programming Guide)

Un’interfaccia non può essere istanziata direttamente. I suoi membri sono implementati da qualsiasi class o struttura che implementa l’interfaccia.

No _model è un riferimento all’interfaccia di un object di class che implementa ITreeModel

_model è un membro di TreeList e ciò significa che è ansible creare un’istanza di una class e quindi conterrà un’istanza di qualche class. per esempio

 _model = new TreeModel(); 

renderà _model contenere un’istanza

ma non puoi farlo

 _model = new ITreeModel(); 

perché ITreeModel è e interfaccia e non è ansible creare un’istanza di un’interfaccia