Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 何时使用扩展以及何时使用接口?_Java_Design Patterns - Fatal编程技术网

Java 何时使用扩展以及何时使用接口?

Java 何时使用扩展以及何时使用接口?,java,design-patterns,Java,Design Patterns,我们可以扩展一个类,但不能实现一个类。我们可以实现接口,但不能扩展接口 在什么情况下我们应该使用extends?extends关键字用于扩展具体/抽象类。通过扩展,u可以重写父类的方法或继承它们。类只能扩展类。 你也可以说界面1延伸到界面2 implements关键字用于实现接口。在这种情况下,您必须定义接口中指示的所有方法。类只能实现接口。扩展用于扩展基类: public abstract BaseProductRepository : IProductRepository

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


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

extends关键字用于扩展具体/抽象类。通过扩展,u可以重写父类的方法或继承它们。类只能扩展类。 你也可以说界面1延伸到界面2


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

扩展
用于扩展基类:

     public abstract BaseProductRepository : IProductRepository
     {
         public IList<T> GetAllProducts()
         { //Implementation }
     }
或扩展接口:

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

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

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

在这里,您可以清楚地看到,您是在
ClassB
中的现有实现的基础上构建的,并且还从两个接口实现了方法。

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

以注入依赖模式为例:

你首先要写一份合同:

     public interface IProductRepository
     {
        IList<T> GetAllProducts();
     }
我希望这个小例子能够澄清extend和Implement之间的区别。很抱歉,我没有在示例中使用java,但它都是面向对象的,所以我想你会明白这一点的

谢谢你的阅读,Geo



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

如您所说。
implement
java关键字用于实现接口,
extends
用于扩展类

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


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

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

关于这个问题有很多类似宗教的争论,我怀疑是否有一个明确的正确答案,但对于它的价值,这里是我的看法。当您的各种类提供相同种类的功能,并且有一些共同的实现细节时,请使用子类化(即扩展)。使用接口实现,以表明您的类提供了某些特定的功能(由接口指定)

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

在Java中没有多重继承,因此一个(子)类只能有一个父类,并且应该仔细考虑子类化,以便选择合适的父类(如果有的话);如果有其他合理的父类,选择一个只反映了该类能力的一小部分的父类可能会在以后的挫折中结束。例如,拥有一个带有SQL Server和Oracle子类的
AbstractSQLExecutor
,这很有意义;但是,让一个FileUtils父类在中包含一些实用程序方法,然后将其子类化以继承该功能是一个坏主意(在这种情况下,您可能应该将helper方法声明为静态的,或者保留对FileUtils实例的引用)


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

接口可以扩展接口
     public interface IProductRepository
     {
        IList<T> GetAllProducts();
     }
     public abstract BaseProductRepository : IProductRepository
     {
         public IList<T> GetAllProducts()
         { //Implementation }
     }
     public class InternetProductRepository extends BaseProductRepository;
     public class StoreProductRepository extends BaseProductRepository;