创建接口实例
本文关键字:实例 接口 创建 | 更新日期: 2023-09-27 18:06:12
我定义了以下接口:
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
),我希望能够通过将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)...