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

时间:2014-04-12 14:58:40

标签: c# .net object interface

我已经找到了完成此任务的答案,但我还没有找到任何东西:我想要一个接口的方法来返回实现它的类的类型的对象。例如:

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

提前谢谢你。

3 个答案:

答案 0 :(得分:10)

你想在这里做什么不会有两个原因:

  1. 接口无法拥有静态成员
  2. 接口需要指定其方法的返回类型。界面不应该知道实现它的所有成员的类型,这会使得这一点失败,并且在许多情况下是无法实现的。
  3. 此外,如果你确实设法做到这一点,它仍然不是好的设计,因为它违反了单一责任原则。你可以通过谷歌搜索或浏览这个网站找到大量的信息,但这个想法 - 如名称所示 - 是一个类应该只有一个目的,它负责。

    所以想象一下,你的班级是Employee班级。该课程的责任非常明确,应该负责保存与公司Employee相关的信息和功能。它可能包含FirstNameGivePromotion()等成员。所以现在让这个类 对自己的数据库访问负责也很奇怪。

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

    public interface IRepository<T>
    {
        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
        }
    }
    

答案 1 :(得分:2)

一种方法是使用泛型:

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

答案 2 :(得分:1)

  

我想要一个接口的方法来返回类的类型对象&gt;实施了它

您似乎忽略了接口:接口不应该对其实现者有任何了解。接口暴露了合同,就是这样。

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