创建接口实例

本文关键字:实例 接口 创建 | 更新日期: 2023-09-27 18:06:12

我定义了以下接口:

public interface IAudit {
    DateTime DateCreated { get; set; }
}
public interface IAuditable {
    IAudit Audit { get; set; }
}

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

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)的实例。理想的情况是:

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的构造函数

我相信这是许多人以前都有过的设计模式,但我无法理解它。如果有人能告诉我如何做到这一点,我将非常感激。

创建接口实例

不能创建接口的实例

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

IAuditable myUser = new User();

没有在代码中定义哪个IAudit适用于哪个IAuditable

你不能只用一个接口直接做到这一点。你需要重新考虑你的设计。

您可以在接口中使用开放泛型类型,并使用封闭类型实现它:

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

我不能指定IAudit接口必须有一个接受IAuditable

参数的构造函数

正确,你不能。在这里看到的。您需要在实现者上创建这样一个构造函数。

在代码中没有任何地方定义哪个IAudit应用于哪个IAuditable我不能指定IAudit接口必须有构造函数,它接受一个IAuditable

您可以通过向IAuditable添加CreateAudit()函数来解决这两个问题。然后,您将从IAuditable中创建IAudit。如果您想在IAuditable中存储对IAudit的引用(反之亦然),以便使它们相互关联,那么使用实现类来实现这一点非常容易。例如,您还可以将GetAuditable()添加到IAudit中以获得创建它的IAuditable

简单的实现是这样的(在实现IAuditable的类上):

public IAudit CreateAudit()
{
    UserAudit u = new UserAudit(UserName);
    return u;
}

显然你不能创建一个接口的实例,但是如果你真的想创建一个传入类的实例,你可以这样做:

IAuditable j = ((IAuditable)Activator.CreateInstance(myObject.GetType()));

你需要知道要构造哪个具体类,在你的例子中,唯一的选择是myObject。

或者你可以研究"依赖注入",它允许你指定将哪种类型的具体类"注入"到构造函数或字段中调用接口的参数中。我不确定你的整体设计,所以这个可能适用。在依赖注入中,你可以在代码中声明IAuditables应该使用UserAudit来创建,不过比起简单地调用"new IAuditable"

,还有更多的准备工作要做。

一种方法是使用泛型。

一旦你有了一个T类型,它实现了I接口,并且有一个公共的、无参数的构造函数,你就可以创建一个T的实例:

public void Create<T>() where T : IAudit, new()
{
     T instance = new T();
     // TODO: Your logic here to use T instance of IAudit
} 

我不知道你的代码结构或目标,但你可以创建一个像上面那样的工厂方法来创建IAudit对象的实例。

如果您需要为一个接口创建Instance,您可以创建一个名为FactoryClass()的公共类,其中包含所有的Interfaces方法。您可以使用以下代码:

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() Class中添加以下代码:

IInterface2 newinter; //creating object for interface in class main()
FactoryClass factoryobj=new FactoryClass();  // creating object for factoryclass

在构造函数中添加以下内容:

newinter=factoryobj.sample_display() // initialisingg the interface object with the instance method of factoryobj of FACTORY CLASS.

你可以用下面的代码来调用这个函数:

newinter.display() //display() is the method in the interface.

您可以在作用域之外创建一个静态Interface变量,然后在代码中使用它。

static IRequestValidator ir;

static void Main(string[] args)...