我正在阅读here中的代码。我在TreeList.cs中找到private ITreeModel _model;
:
namespace Aga.Controls.Tree
{
public class TreeList: ListView
{
#region Properties
//...
private ITreeModel _model;
public ITreeModel Model
{
//...
}
//...
}
}
,ITreeModel是ITreeModel.cs中的一个接口:
namespace Aga.Controls.Tree
{
public interface ITreeModel
{
/// <summary>
/// Get list of children of the specified parent
/// </summary>
IEnumerable GetChildren(object parent);
/// <summary>
/// returns wheather specified parent has any children or not.
/// </summary>
bool HasChildren(object parent);
}
}
_model
是一个实例化对象吗?
被修改:
TreeList.cs
:
namespace Aga.Controls.Tree
{
public class TreeList: ListView
{
#region Properties
/// <summary>
/// Internal collection of rows representing visible nodes, actually displayed in the ListView
/// </summary>
internal ObservableCollectionAdv<TreeNode> 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; }
}
//....
}
}
}
Edited2 :
某处:
public partial class RegistrySample : UserControl
{
public RegistrySample()
{
InitializeComponent();
_tree.Model = new RegistryModel();
}
}
class RegistryModel : ITreeModel
答案 0 :(得分:4)
当然可以这样做,但底层对象必须实现此接口。所以你可以做类似
的事情ITreeModel _model = new TreeModel();
其中
public class TreeModel:ITreeModel
{
...
}
答案 1 :(得分:0)
它已在代码中的其他位置实现。如果你致电_model.GetType().ToString()
,你会发现它不仅仅是一个界面。
但要正确回答你的问题,YES,可以实例化一个界面。你们中的一些人可能会认为“不可以”,但可以完成(有一些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!
答案 2 :(得分:0)
_model
应包含实现的类的实例ITreeModel
接口(或null
}。
答案 3 :(得分:0)
来自Interfaces (C# Programming Guide)
无法直接实例化接口。它的成员是 由实现接口的任何类或结构实现。
答案 4 :(得分:0)
没有_model是类对象的实例接口引用 实现 ITreeModel
答案 5 :(得分:0)
_model
是TreeList
的成员,这意味着您可以创建类的实例,然后它将包含某个类的实例。例如
_model = new TreeModel();
会使_model
包含一个实例
但你做不到
_model = new ITreeModel();
因为ITreeModel
是和接口而你无法创建接口的实例
答案 6 :(得分:0)
您永远不能直接在C#中实例化接口,但是可以,您可以实例化实现该接口的子类。例如:
interface IShape
{
//Method Signature
void area(int r);
}
public class Circle : IShape
{
//method Implementation
void area(int r)
{
float area;
area = 3.14 * r * r;
Console.WriteLine("The area of the circle is: {0}",area);
}
}
public class Shapes
{
public static void Main() {
//Uncommenting the following line will cause compiler error as the
// line tries to create an instance of interface.
// interface i = new IShape();
// We can have references of interface type.
IShape i = new Circle();
i.area(10);
}
}