【问题标题】:Make a interface method return an object of type of the class which implemented it使接口方法返回实现它的类的类型的对象
【发布时间】:2014-04-12 14:58:39
【问题描述】:

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

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

提前谢谢你。

【问题讨论】:

  • 您是否可以接受提供替代设计来实现此目的的答案?因为你的建议不是一个好的设计,而且很难做好
  • 如果它可以帮助我,当然! :)
  • 接口不能有静态成员,所以无论你试图实现什么都行不通。

标签: c# .net object interface


【解决方案1】:

你想在这里做的事情不会有两个原因:

  1. 接口不能有静态成员
  2. 接口需要指定其方法的返回类型。接口不应该知道实现它的所有成员的类型,这不符合要点,并且在许多情况下是无法实现的。

而且,如果你真的做到了,它仍然不是一个好的设计,因为它违反了单一责任原则。您可以通过谷歌搜索或浏览此站点找到大量有关此的信息,但想法(如名称所示)是一个类应该只具有它负责的单一用途。

假设您的班级是 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
    }
}

【讨论】:

    【解决方案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 ();
            }
        }
    }
    

    【讨论】:

    • 但是为什么你需要一个A 的实例来创建A?对我来说看起来很糟糕的设计。
    • 是的,没错。从数据库中获取新对象作为现有对象的实例成员是没有意义的。
    • 我同意,我试图只解决问题的机制,而不是设计问题——我想要更多的背景信息..
    • 可以理解,但由于它在原始问题中是静态的,我建议您实际上是在引入提问者已经意识到的新设计问题
    • 我选择other作为answare但这也很好,为什么A的一个实例需要创建另一个A的实例?例如,如果您有 Car 类并且想要下一个模型,那么 car1.getNextModel() 将返回另一个汽车对象。
    【解决方案3】:

    我希望接口的方法返回一个对象,该对象的类型与实现它的类的类型相同

    您似乎错过了接口的要点:接口不应该对其实现者有任何了解。接口暴露了合约,就是这样。

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

    【讨论】:

    • 我很抱歉出现错误,但是我该如何存档呢?例如,如果我有两个不同的类,带有一个接口的方法,它们返回一个与谁调用它的类相同的对象?
    • @MauroValvano 不是你问的,而是Take a look at factory pattern
    猜你喜欢
    • 2020-06-09
    • 2011-05-16
    • 2011-06-22
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    相关资源
    最近更新 更多