Creating an Instance of an Interface
我定义了以下接口:
1 2 3 4 5 6 7 | public interface IAudit { DateTime DateCreated { get; set; } } public interface IAuditable { IAudit Audit { get; set; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class User : IAuditable { public string UserName { get; set; } public UserAudit Audit { get; set; } } public class UserAudit : IAudit { public string UserName { get; set; } public DateTime DateCreated { get; set; } public UserAdit(User user) { UserName = user.UserName; } } |
现在给定一个对象,它是
1 2 3 |
但是我有一大堆问题:
- 无法创建接口的实例
- 不,代码中的何处定义了哪个
IAudit 适用于哪个IAuditable 。 - 我不能指定
IAudit 接口必须有一个采用IAuditable 的构造函数。
我敢肯定这是很多人以前都有过的设计模式,但我无法理解。如果有人能告诉我如何实现这一目标,我会非常感激。
No where in the code does it define which IAudit applies to which
IAuditable
I can't specify that the IAudit interface must have a
constructor which takes an IAuditable
您可以通过向您的
简单实现如下(在实现IAuditable的类上):
1 2 3 4 5 |
You can't create an instance of an interface
对的。创建实现接口的对象的实例:
1 |
No where in the code does it define which IAudit applies to which IAuditable
您不能只使用一个接口直接执行此操作。你需要重新考虑你的设计。
您可以在接口中使用打开的泛型类型,并使用关闭的类型实现它:
1 2 3 4 5 6 7 8 9 10 11 12 | public interface IAudit<T> { DateTime DateCreated { get; set; } } public class UserAudit : IAudit<User> { public string UserName { get; set; } public DateTime DateCreated { get; set; } public UserAdit(User user) { UserName = user.UserName; } } |
I can't specify that the IAudit interface must have a constructor which takes an IAuditable
对,你不能。看这里。您需要在实现者上创建这样的构造函数。
显然,您不能创建接口的实例,但是如果您真的要创建传入类的实例,可以这样做:
1 | IAuditable j = ((IAuditable)Activator.CreateInstance(myObject.GetType())); |
您需要知道要构造哪个具体类,在您的示例中,唯一的选项是MyObject。
或者,您可以研究称为"依赖注入"的东西,它允许您指定要"注入"到在构造函数或字段中调用接口的参数中的具体类的类型。我不确定你的总体设计,所以这可能适用。在依赖注入中,您可以在代码中声明IAuditables应该使用userAudit创建,尽管有比简单地调用"new IAuditable"更多的连线。
一种方法是使用泛型。
一旦您有了一个实现i接口的t类型,并且有了一个公共的无参数构造函数,您就可以创建t的一个实例:
1 2 3 4 5 |
我不知道您的代码体系结构或目标,但是您可以创建一个像上面这样的工厂方法来创建IAudit对象的实例。
我们不能创建任何接口的实例。接口可以保存继承或实现该接口的内存地址。例如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | interface IInterface { void GetData(); } public class SomeClass : IInterface { public void GetData() { //do something } } class Program { static void Main(string[] args) { IInterface Iface = new SomeClass(); Iface.GetData(); ReadLine(); } } |
如果需要为接口创建实例,可以创建一个名为FactoryClass()的公共类,该类包含所有接口方法。您可以使用以下代码:
1 2 3 4 5 6 7 8 9 | public class FactoryClass //FactoryClass with Interface named"IINterface2" { public IInterface2 sample_display() //sample_display() is a instance method for Interface { IInterface2 inter_object = null; //assigning NULL for the interface object inter_object = new Class1(); //initialising the interface object to the class1() return inter_object; //returning the interface object } } |
在main()类中添加以下代码:
1 2 | IInterface2 newinter; //creating object for interface in class main() FactoryClass factoryobj=new FactoryClass(); // creating object for factoryclass |
在构造函数中添加以下内容:
1 | newinter=factoryobj.sample_display() // initialisingg the interface object with the instance method of factoryobj of FACTORY CLASS. |
可以使用以下代码调用ffunction:
1 | newinter.display() //display() is the method in the interface. |