C# 使接口方法返回实现它的类类型的对象

C# 使接口方法返回实现它的类类型的对象,c#,.net,object,interface,C#,.net,Object,Interface,我已经搜索了一个答案来实现这一点,但我没有找到任何东西:我希望接口的方法返回实现它的类类型的对象。例如: interface InterfaceA { public static returnValue getObjectFromDatabase(); //What do i need to put as returnValue? } 然后,如果我有两个实现它的类(例如,ClassA和ClassB),我希望: ClassA obj1 = ClassA.getObjectFromDatab

我已经搜索了一个答案来实现这一点,但我没有找到任何东西:我希望接口的方法返回实现它的类类型的对象。例如:

interface InterfaceA {
   public static returnValue getObjectFromDatabase(); //What do i need to put as returnValue?
}
然后,如果我有两个实现它的类(例如,ClassA和ClassB),我希望:

ClassA obj1 = ClassA.getObjectFromDatabase(); //return object of class ClassA
ClassB obj2 = ClassB.getObjectFromDatabase(); //return object of class ClassB
提前谢谢你

我希望接口的方法返回一个类类型的对象,该类>实现了接口

您似乎忽略了接口的要点:接口不应该了解其实现者。接口公开合同,仅此而已


另外,从您的示例中,我可以看到您正在尝试创建一个
静态方法
,但是接口和静态方法彼此相差很远。接口与实例绑定,而不是与类型绑定。

一种方法是使用泛型:

class Program
{
    interface MyInterface<SomeType>
    {
        SomeType getObjectFromDatabase ();
    }

    class A : MyInterface<A> { public A getObjectFromDatabase () { return new A (); } }
    class B : MyInterface<B> { public B getObjectFromDatabase () { return new B (); } }

    class Program2
    {
        static void Main ()
        {
            A a1, a2;
            a1 = new A ();
            a2 = a1.getObjectFromDatabase ();
            B b1, b2;
            b1 = new B ();
            b2 = b1.getObjectFromDatabase ();
        }
    }
}
类程序
{
接口MyInterface
{
SomeType getObjectFromDatabase();
}
类A:MyInterface{public A getObjectFromDatabase(){return new A();}
类B:MyInterface{public B getObjectFromDatabase(){return new B();}
班级计划2
{
静态空隙干管()
{
A a1,a2;
a1=新的A();
a2=a1.getObjectFromDatabase();
B b1,b2;
b1=新的B();
b2=b1.getObjectFromDatabase();
}
}
}

出于两个原因,您想在此处执行的操作不起作用:

  • 接口不能有静态成员
  • 接口需要指定其方法的返回类型。接口不应该知道实现它的所有成员的类型,这违背了这一点,在许多情况下是不可能实现的
  • 此外,如果您确实做到了这一点,它仍然不是一个好的设计,因为它违反了单一责任原则。你可以通过谷歌搜索或者浏览这个网站来找到很多关于这个的信息,但是正如名字所表明的那样,一个类应该只有一个它负责的单一目的

    例如,假设您的类是
    Employee
    类。该类的职责非常明确,它应该负责保存与公司中
    员工相关的信息和功能。它可能有
    FirstName
    GivePromotion()
    等成员。因此,现在让这个类也负责自己的数据库访问会很奇怪

    因此,如何实现这一点将取决于另一个类,该类负责从数据库中检索对象。一种常见的设计模式是存储库模式。您可能还想利用泛型。因此,您的存储库界面可能如下所示:

    public interface IRepository<T>
    {
        T GetFromDatabase()
    }
    
    公共接口IRepository
    {
    T GetFromDatabase()
    }
    
    然后,您可以使用通用存储库实现:

    public class Repository<T> : IRepository<T>
    {
        T GetFromDatabase()
        {
            //Your actual code for database retrieval goes here
        }
    }
    
    public class EmployeeRepository : IRepository<Employee>
    {
        Employee GetFromDatabase()
        {
            //Your actual code for database retrieval goes here
        }
    }
    
    公共类存储库:IRepository
    {
    T GetFromDatabase()
    {
    //数据库检索的实际代码在这里
    }
    }
    
    或者,如果某些或所有类的数据库检索代码非常不同,则可以使用特定的存储库实现:

    public class Repository<T> : IRepository<T>
    {
        T GetFromDatabase()
        {
            //Your actual code for database retrieval goes here
        }
    }
    
    public class EmployeeRepository : IRepository<Employee>
    {
        Employee GetFromDatabase()
        {
            //Your actual code for database retrieval goes here
        }
    }
    
    公共类EmployeeRepository:IRepository
    {
    员工GetFromDatabase()
    {
    //数据库检索的实际代码在这里
    }
    }
    
    很抱歉出现了这些错误,但我如何才能将其存档?例如,如果我有两个不同的类,使用一个接口的方法,返回一个对象,该对象的类与调用它的人的类相同?@MauroValvano不完全是您所问的,但您是否愿意给出一个答案,给出一个替代设计来实现这一点?因为你所建议的不是一个好的设计,如果它能帮助我的话,很难让它正常工作,当然!:)接口不能有静态成员,因此无论您试图实现什么都无法实现。但是,为什么您需要一个
    A
    实例来创建
    A
    ?我觉得这个设计很糟糕。是的,没错。从数据库中获取一个新对象作为现有对象的实例成员是没有意义的。我同意,我只是试图解决问题的机制,而不是设计问题——我希望有更多的上下文……可以理解,但是,由于在最初的问题中它是静态的,我建议你实际上是在引入新的设计问题,提问者已经意识到这是一个问题。我选择另一个作为answare,但这也很好,为什么需要创建另一个answare实例?例如,如果您有一个类Car,并且您想要下一个模型,那么car1.getNextModel()将返回另一个Car对象。