何时使用扩展和何时使用接口?

时间:2009-10-05 08:08:54

标签: java design-patterns

我们可以扩展一个类,但是我们不能实现一个类。我们可以实现一个接口,但不能扩展接口。

我们应该在什么情况下使用extends?

5 个答案:

答案 0 :(得分:5)

extends用于扩展基类:

class ClassX extends ClassY {
    ...
}

扩展界面:

interface InterfaceA extends InterfaceB {
    ...
}

请注意,接口不能实现其他接口(很可能是因为它们没有实现)。

Java没有对类和接口强加任何命名约定(与.NET世界中的接口的IFoo相反),而是使用extendsimplements之间的差异表示与程序员的区别:

class ClassA extends ClassB implements InterfaceC, InterfaceD {
    ...
}

在这里,您可以清楚地看到,您正在构建ClassB中的现有实现,并且实现来自两个接口的方法。

答案 1 :(得分:3)

是一个用途问题。接口可以用作与应用程序的契约,然后可以使用基类来扩展该接口,因此它是松散耦合的。

以注入依赖模式为例:

你先签合同:

     public interface IProductRepository
     {
        IList<T> GetAllProducts();
     }

然后你用一个基类扩展你的合同:

     public abstract BaseProductRepository : IProductRepository
     {
         public IList<T> GetAllProducts()
         { //Implementation }
     }

现在您可以选择将base扩展为两个或更多具体类:

     public class InternetProductRepository extends BaseProductRepository;
     public class StoreProductRepository extends BaseProductRepository;

我希望这些小例子能够清除extend和Implement之间的差异。对不起,我没有使用java作为示例,但都是OO,所以我认为你会明白这一点。

感谢阅读,Geo


我没有完成注入依赖模式的代码但是想法就在那里,网上也有很好的文档记录。如果您有任何问题,请告诉我。

答案 2 :(得分:3)

实际上,您可以扩展接口 - 在您定义另一个接口的情况下。

关于这个问题有许多准宗教的论点,我怀疑是否有一个明确的正确答案,但是对于这里有什么值得我采取的事情。当您的各种类提供相同类型的功能时,使用子类化(即extends),并具有一些共同的实现细节。使用接口实现,以表示您的类提供了某些特定功能(由接口指定)。

请注意,两者并不相互排斥;实际上,如果超类实现了接口,那么任何子类也将被视为实现该接口。

在Java中没有多重继承,因此(子)类只能有一个父类,并且应仔细考虑子类,以便选择合适的父类(如果有的话);如果有其他明智的父母课程,那么选择一个只反映一小部分课程能力的家长可能会在以后挫折中结束。因此,例如,使用SQL Server和Oracle子类AbstractSQLExecutor非常有意义;但是有一个带有一些实用程序方法的FileUtils父类,然后为了继承该功能而在那里进行子类化,这是一个坏主意(在这种情况下,您可能会将辅助方法声明为静态,或者保持对而不是FileUtils实例。

此外,子类化将您与实现(父级)的实现细节联系在一起,而不是实现接口。我会说,一般来说,最好只是实现接口,至少在最初阶段,并且只在具有清晰层次结构的相同或类似包中形成类的层次结构。

答案 3 :(得分:0)

extends关键字用于扩展具体/抽象类。通过扩展,你可以覆盖父类的方法/继承它们。一个类只能扩展类。 你也可以说interface1扩展了intenface2。

implements关键字用于实现接口。在这种情况下,你必须定义接口中指示的所有方法。一个类只能实现接口。

答案 4 :(得分:0)

像你说的那样。 implement java关键字用于实现extends用于扩展类的接口。

这取决于你想做什么。通常,当您要强制实施(如合同)时,您将使用接口。类似于abstract类(但是使用抽象类,您可以使用非抽象方法)。

请记住,在java中,您只能扩展一个类,并为实现类实现零到多个接口。与C#不同,您可以使用:扩展多个类,并且C#仅对接口和类使用:符号。