创建接口实例

时间:2011-08-19 13:25:57

标签: c# interface

我定义了以下接口:

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

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

IAuditable界面说明我将拥有Audit个类。 IAudit接口是该类的实际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)的对象,我希望能够通过输入{IAudit(来自上面的UserAdit)创建一个intance。 {1}}对象进入构造函数。理想情况下,我会有类似的东西:

IAuditable

但是我有很多问题:

  • 您无法创建界面实例
  • 在代码中没有定义哪个if (myObject is IAuditable) { var audit = new IAudit(myObject) { DateCreated = DateTime.UtcNow }; // This would create a UserAudit using the above example } 适用于哪个IAudit
  • 我无法指定IAuditable接口必须具有带IAudit
  • 的构造函数

我确信这是许多以前的设计模式,但我无法理解它。如果有人能告诉我这是如何实现的,我真的很感激。

6 个答案:

答案 0 :(得分:16)

  

在代码中没有定义哪个IAudit适用于哪个   IAuditable了   我无法指定IAudit接口必须具有   采用IAuditable的构造函数

您可以通过向CreateAudit()添加IAuditable功能来解决这两个问题。然后,您将获得IAudit创建的IAuditable。如果您希望在IAudit中存储对IAuditable的引用(或反之亦然),那么您可以让它们彼此相关,那么让实现类很容易实现。您也可以将GetAuditable()添加到IAudit以获取其创建的IAuditable,例如。

简单的实现看起来像这样(在实现IAuditable的类上):

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

答案 1 :(得分:15)

  

您无法创建界面实例

正确。您可以创建一个对象实现接口的实例:

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

的构造函数

正确,你不能。见here。您需要在实现者上创建这样的构造函数。

答案 2 :(得分:4)

一种方法是使用泛型。

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

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

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

答案 3 :(得分:4)

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

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

您需要知道要构造哪个具体类,在您的示例中,唯一的选项是myObject。

或者你可以研究一种叫做“依赖注入”的东西,它允许你指定哪种类型的具体类“注入”参数,这些参数可以在构造函数或字段中调用接口。我不确定你的总设计,所以这可能适用。在Dependancy Injection中,您可以在代码中声明IAuditables应该使用UserAudit创建,尽管有一些更多的连接而不是简单地调用“new IAuditable”

答案 4 :(得分:0)

如果您需要为接口创建实例,可以创建一个名为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()类中添加以下代码:

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.

您可以使用以下代码调用ffunction:

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

答案 5 :(得分:0)

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

static IRequestValidator ir;


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