我定义了以下接口:
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
我确信这是许多以前的设计模式,但我无法理解它。如果有人能告诉我这是如何实现的,我真的很感激。
答案 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)...