关于c#:创建接口实例

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; }
}

IAuditable接口表示我将为哪些类提供Audit接口。IAudit接口是该类的实际Audit。例如,假设我有以下实现:

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;
    }
}

现在给定一个对象,它是IAuditable(User,从上面),我想通过将IAuditable对象输入构造函数来创建IAudit(useradit,从上面)。理想情况下,我会有这样的东西:

1
2
3
if (myObject is IAuditable) {
    var audit = new IAudit(myObject) { DateCreated = DateTime.UtcNow }; // This would create a UserAudit using the above example
}

但是我有一大堆问题:

  • 无法创建接口的实例
  • 不,代码中的何处定义了哪个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添加一个CreateAudit()函数来修复这两个问题。然后你会得到一个由IAuditable创建的IAudit。另外,如果您希望在IAuditable中存储对IAudit的引用(反之亦然),以便使它们相互关联,那么很容易让一个实现类这样做。例如,您还可以将GetAuditable()添加到IAudit中,以获取创建它的IAuditable

简单实现如下(在实现IAuditable的类上):

1
2
3
4
5
public IAudit CreateAudit()
{
    UserAudit u = new UserAudit(UserName);
    return u;
}


You can't create an instance of an interface

对的。创建实现接口的对象的实例:

1
IAuditable myUser = new User();

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
public void Create<T> where T : IAudit, new()
{
     T instance = new T();
     // TODO: Your logic using such T instance of IAudit implementation
}

我不知道您的代码体系结构或目标,但是您可以创建一个像上面这样的工厂方法来创建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.