Высокий уровень интерфейс абстракции?

Я смущен абстракцией и инкапсуляцией.Я чувствую, что класс-это инкапсуляция, поскольку он инкапсулирует данные и поведение,а интерфейс-абстракция.Пожалуйста, прокомментируйте

4 ответов


Я думаю, что ваша терминология путается.

  1. инкапсуляция - добавляет соответствующие данные и функциональность в одном месте. Мы можем получить это через классы

  2. полиморфизм - позволяет обрабатывать значения различных типов данных с помощью единого интерфейса.

полиморфизм может быть достигнут путем наследования базовых классов (с виртуальными функциями) и / или путем реализации межфазные границы.

эти методы (и другие) дают нам абстрагирование, что действительно относится к любому из процессов, которые мы используем, чтобы разбить проблему на более мелкие компоненты.

редактировать

Q) вы спрашиваете: "могу ли я сказать,что абстракция-это самая верхняя иерархия, которая достигается путем инкапсуляции и полиморфизма?"

A) я не могу ответить на этот вопрос, я не знаю, что вы подразумеваете под "самым верхним" и "самым высоким". Нет иерархия здесь.

Функциональная Декомпозиция это форма абстракции, она может быть достигнута без использования объектной ориентации, где она должна быть в иерархии?

лучшее, что я могу сделать с иерархией, это определение (прямо из моей головы, так что YMMV)

  1. абстракция-это практика разбить большую проблему на меньшие компоненты, поэтому каждый меньше проблема может быть в (родственник) изоляция.
  2. полиморфизм-это метод, который мы можем используйте для достижения абстракции. Он включает в себя определение различных типов данных и поведения, которые могут быть обрабатывается однородным способом.
  3. интерфейс объявляет только типы поведение, инкапсулирующее поведение в типе. Он не обеспечивает фактическое поведение или данные
  4. абстрактный класс объявляет типы поведение, но может также обеспечить поведение и данные, все инкапсулированные в типе.
  5. , интерфейс можно увидеть как проще или чище форма полиморфизма, чем абстрактные занятия.

посмотрите на статью Википедии о абстракция в информатике. В частности, вас, вероятно, интересует абстракция в отношении объектно-ориентированного программирования. Я процитировал часть соответствующего раздела ниже:

в объектно-ориентированное программирование теория , абстракция включает в себя возможность определение объектов, представляющих абстрактные "актеры", которые могут выполнять работу, сообщают и изменить их состояние, и "общаться с другими объекты в система. Срок заключения относится к сокрытию сведений о состоянии, но расширение понятия типа данных из более ранних языков программирования наиболее сильно ассоциировать поведение с данные и стандартизация способа что различные типы данных взаимодействуют, это начало абстракции. Когда абстракция переходит в определенные операции, включающие объекты различных типов подставляться, это называется полиморфизмом. Когда это поступления в противоположное направление, внутри типов или классов, структурирование их для упрощения комплекса набор отношений, он называется делегирование или наследование.

вообще, я бы сказал, что интерфейсы и классы должны быть примерами абстракций, имеющих дело с данными как концептуальной "вещью", а не с необработанными данными. Инкапсуляция используется для того, чтобы эти абстракции хорошо работали с другими абстракциями концептуально разных "вещей"."


Я думаю, вы все правильно поняли. Интерфейс говорит, широко:вот что это такое. Класс говорит: вот как это работает; я спрячу детали внутри себя. Класс-это (обычно) конкретная реализация абстракции интерфейса.


цель инкапсуляции-скрыть детали реализации:

очень надуманный пример:

public class Person {
  private int age;

  public boolean canBuyBeer() {
    return age >= 21;
  }

}

вы можете позже изменить его на:

public class Person {
  private int age;
  private boolean isInUSA


  public boolean canBuyBeer() {
    if( isInUSA )
        return age >= 21;
    else
         return age >= 18;
  }

}

правила относительно возраста и происхождения могут измениться, но вызывающему абоненту не нужно знать.

интерфейсы могут использоваться для абстракции различных типов. Рассматривайте это:

public interface Beverage {
  public boolean containsAlchohol;
}

public class Soda implements Beverage {
  public boolean containsAlchohol {  
      return false;
  }
}
public class Beer implements Beverage {
  public boolean containsAlchohol {
       return true;
  }
}

вы можете обновить человека, как:

public class Person {
  private int age;
  private boolean isInUSA


  public boolean canBuyBeverage(Beverage b) {
    if( b.containsAlchohol() ) {
       if( isInUSA )
           return age >= 21;
       else
           return age >= 18;
    }
    else {
        return true;
    }
  }

}

так человек инкапсуляция логика если человек может купить определенный вид напитка. Интерфейс напитка абстрагирует логику, связанную с напитком.

лучшие примеры можно иметь, но это общая идея.