Является ли интерфейс высшим уровнем абстракции? - PullRequest
6 голосов
/ 29 июля 2009

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

Ответы [ 4 ]

13 голосов
/ 29 июля 2009

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

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

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

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

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

EDIT

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

А) Я не могу ответить на этот вопрос, я не знаю, что вы имеете в виду под «самым высоким» и «самым высоким». Здесь нет иерархии.

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

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

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

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

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

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

2 голосов
/ 29 июля 2009

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

1 голос
/ 29 июля 2009

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

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

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;
  }
}

Вы можете обновить Person как:

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;
    }
  }

}

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

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

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