繁体   English   中英

接口如何在Java中实现100%抽象?

[英]How can interface achieve 100% abstraction in Java?

我有这个概念性查询。 我们说接口用于实现 100% 抽象,即隐藏所有实现。

但是在接口中,所有的方法都被声明为抽象的。 没有实施。

当另一个类实现相同的接口时,就没有更多的抽象,因为实现是在实现它的类中定义的。

请照亮它。

您对提供的抽象接口有误解。

1.什么是接口?
接口是仅包含(公共)方法签名的类型 ob 对象(可能因语言而异)。 它不提供这些方法的实现(函数体)。 它可以看作是实现类必须完成的一种契约。

2. 使用接口可以实现什么样的抽象?

使用“紫罗兰 UML 编辑器”创建 (使用“紫罗兰 UML 编辑器”创建)

在这个结构中,类User只知道对象数组中的对象一个签名为void Display() 这个方法是如何实际实现的对于User是未知的。

发生的抽象由红线描绘。 这是接口实现的唯一(非常强大的)抽象。

void Display()的各种变体的实现细节对User是隐藏的。 它可以只调用 IDisplayable.Display() 并通过多态调用正确的方法。

我想解释一下非编程语言的区别。

假设您有电视和遥控器。 通过遥控器,您可以使用电视进行操作。

遥控器有开和关按钮。 当您单击开按钮时,电视将打开。 但是你不知道 On button implementation 的内部结构。 关闭按钮的情况也是如此,它可以关闭电视。

现在Remote是一个接口, TV是一个实现对象。 在 java 编程语言中映射相同的概念,您将变得更加清晰。

Remote 是与 On 和 Off 方法的接口。 TV实现Remote接口。

抽象是隐藏细节,而电视已经做到了。 即使没有远程接口,电视也可以有开和关按钮并隐藏细节。

抽象方法的接口不是定义抽象所必需的。 但是接口是纯抽象的,隐藏了实现的细节。 它通过隐藏实现者的内部实现来公开合约。

看看相关问题

抽象 VS 信息隐藏 VS 封装

这个陈述在以下意义上是正确的:

当我们使用接口实现作为接口的实例时,实现确实是隐藏的,即实际上可以有任何实现的对象。

这个例子:

public <T> Set<T> listToSet(List<T> list) {
    HashSet<T> result = new HashSet<>();
    for (T t: list) {
        result.add(t);
    }
    return result;
}

这里的含义是:

  1. 调用者可以传递任何List<T>实现,并且该实现对方法的内部函数是隐藏的,它只知道传递的是List<T> ,因此可以迭代它。

  2. 该方法返回一个Set<T> ,具体实现对调用者隐藏,可以有任何Set<T>实现(示例中为HashSet<T> )。

因此,对于变量或返回类型的声明类型是接口的情况,关于 100% 抽象的说法是正确的。

在 Java 中,接口不能包含实现以确保抽象(但这不是一般的 OOP 要求),因此当您通过接口类型操作对象时,您不能依赖任何实现。

在现代 Java 中,您可以为方法提供一些默认实现,这与抽象并不矛盾,因为您不能使用属性,因此提供的代码只是“功能性的”,因为它只描述了通用行为。

另一方面,您有提供某些接口的完整实现的具体类。

在您之间有抽象类,它们提供部分实现。

一个好的做法是通过以下方式隐藏实现:

  • 为概念的用户提供界面
  • 提供工厂来隐藏具体类的现实

当然,这是一种理想。

我认为如果对实现一无所知只是我们有需求规范那么我们应该去接口和内部接口每个方法都是公共和抽象的,无论是否声明,因此接口也被认为是 100% 纯抽象类

我认为下面的程序将帮助您了解接口和抽象:

  interface Person{
   void dsplay();
}
class Student implements Person{
   public void dsplay() {
      System.out.println("This is display method of the Student class");
   }
}
class Lecturer implements Person{
   public void dsplay() {
      System.out.println("This is display method of the Lecturer class");
   }
}
public class AbstractionExample{
   public static void main(String args[]) {
      Person person1 = new Student();
      person1.dsplay();
      Person person2 = new Lecturer();
      person2.dsplay();
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM