代码之家  ›  专栏  ›  技术社区  ›  pankajt

什么时候使用扩展,什么时候使用接口?

  •  2
  • pankajt  · 技术社区  · 17 年前

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

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

    5 回复  |  直到 17 年前
        1
  •  5
  •   Joey Gumbo    17 年前

    extends 用于 扩展基类:

    class ClassX extends ClassY {
        ...
    }
    

    或 扩展接口:

    interface InterfaceA extends InterfaceB {
        ...
    }
    

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

    Java不为类与接口强加任何命名约定(与之相反) IFoo 用于.NET世界中的接口),而使用 延伸 和 implements 表示与程序员的区别:

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

    在这里,您可以清楚地看到,在 ClassB 而且 实施 来自两个接口的方法。

        2
  •  3
  •   Geo    17 年前

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

    以注入依赖模式为例:

    你首先要写一份合同:

         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;
    

    我希望这个小例子可以消除扩展和实现之间的差异。抱歉,我没有用Java作为例子,但都是OO,所以我想你会明白的。

    谢谢你的阅读,geo


    我没有完成注入依赖模式的代码,但是这个想法已经存在了,并且在网络上有很好的文档记录。如果有任何问题,请告诉我。

        3
  •  3
  •   Andrzej Doyle    17 年前

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

    关于这个问题,有很多类似宗教的争论,我怀疑有一个明确的正确答案,但我的看法是值得的。使用 子类化 (即 extends ,当不同的类提供相同类型的功能,并且有一些共同的实现细节时。使用 接口实现 ,以表示类提供了一些特定的功能(由接口指定)。

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

    在Java中没有多重继承,所以(子)类只能有一个父类,并且应该仔细考虑子类,以便选择一个合适的父级;如果只存在少量的类的能力,如果有其他明智的父类,那么选择一个父级的父类很有可能在以后的挫折中结束。锿。例如,有一个 AbstractSQLExecutor 使用SQL Server和Oracle子类有很大的意义;但是如果有一个fileutils父类,其中包含一些实用程序方法,然后在整个位置上对其进行子类化,以便继承该功能,这是一个坏主意(在这种情况下,您可能会将helper方法声明为静态的,或者保留对fileutils实例的引用)。

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

        4
  •  0
  •   Koekiebox    17 年前

    就像你说的。这个 implement Java关键字用于实现一个接口,其中 extends 用于扩展类。

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

    记住,在Java中,只能扩展一个类,并为实现类实现0到多个接口。与C不同,在C中,可以使用 : ,其中c只使用 以下内容: 接口和类的符号。

        5
  •  0
  •   avd    17 年前

    扩展关键字用于扩展具体/抽象类。通过扩展,您可以重写父类的方法/继承它们。类只能扩展类。 你也可以说接口1扩展了意向面2。

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

    推荐文章