Использование библиотеки jackcess для работы с MS Access через Java

Jakcess — библиотека на чистом Java для чтения и редактирования реляционной базы данных Access от компании Microsoft. Данная библиотека, на момент написания данной статьи(а это 30.04.2014), поддерживает версии MS Access 2000 — 2010. Данная библиотека предоставляет кросс-платформенный, ясный Java API для использования MS Access в пользовательских Java программах . Jakcess хорошо задокументирован и является частью проекта OpenHMS, который является брендом, продвигающий коллекции open source проектов.

Что нам потребуется для использования библиотеки Jackcess?

Если мы скачаем библиотеку jackcess.jar  попытаемся использовать ее, то у нас ничего не получится, так как у Jakcess есть зависимости, т.е. он еще нуждается в дополнительных библиотеках, которые будет необходимо параллельно добавить. Данные зависимости используются только самой библиотекой, вам остается только пользоваться чисто классами Jackcess и все. Ниже приведу зависимости которые будут необходимы для полноценной работы и следует отметить, что необходимо учитывать версии зависимостей, так как новая версия зависимости может включать видоизмененные классы, которые в текущей версии библиотеки Jackcess не успели обновить, поэтому вам необходимо это учитывать.

Зависимости компиляции

Ниже представлен список зависимостей, которые требуются для компиляции и запуска приложения с библиотекой Jackcess:

Наименование Ссылка  Версия   Тип  Лицензия Опции
commons-lang commons-lang 2.0 jar The Apache Software License, Version 2.0 Нет
commons-logging commons-logging 1.0.3 jar The Apache Software License, Version 2.0 Нет
org.apache.poi poi 3.9 jar The Apache Software License, Version 2.0 Да

Зависимости запуска программы с Jackcess

Следующие зависимости необходимы для среды времени выполнения:

 Наименование   Ссылка   Версия   Тип  Лицензия Опции
log4j log4j 1.2.7 jar The Apache Software License, Version 2.0 Да

Зависимости для тестирования

Следующие зависимости необходимы для тестирования приложения с Jackess:

Наименование Ссылка Версия Тип Лицензия
junit junit 4.11 jar Common Public License Version 1.0

Замечание 1. В данной статье приведены 3 зависимости, полный перечень зависимостей можете найти на официальном сайте — вот на этой странице.

Замечание 2.  Вам не нужно иметь все зависимости, достаточно те, которые я тут привел.

Пример использования Jackcess

try {
    Table table = DatabaseBuilder.open(new File("E:\\file.mdb")).getTable("Table");//Читаем из таблицы "Table"
     for(Row row : table) {
        System.out.println("Look ma, a row: " + row.get("Column"));//Читаем колонку под именем "Column"
     }
} catch (Exception ex) {
    ex.printStackTrace(); 
}

 

Часть 1. Работа с XML в Java. Описание

В Java JDK встроены 2 вида XML парсеров, которые доступны как DOM(Document Object Model) и SAX(Simple API for XML). У обеих у них как свои преимущества, так и недостатки. В данном посте приведены примеры работы с файлами XML: будет создан, изменен и прочтен файл XML с помощью DOM и SAX.

DOM XML парсер

DOM парсер — это самый легкий инструмент для работы с XML структурой в Java. При использовании данного подхода все содержимое файла XML загружается в память компьютера, моделируя объект, чтобы можно было легко производить операции со структурой файла, но, данная легкость расплачивается  прожорливостью памяти и ресурсов процессора, поэтому, данный способ эффективен, если производиться операция с файлом небольшого размера.

SAX XML парсер

SAX парсер, в отличии от DOM, не загружает структуру документа в память, а использует для манипуляции функцию обратного вызова (org.xml.sax.helpers.DefaultHandler), с помощью которого он держит связь между пользователем и файлом. Помимо этого, SAX парсер имеет возможность в любой момент обратиться к любой части XML документа и манипулировать локальным содержимым, по этой причине SAX быстрее и менее расточительнее, чем DOM парсинг.

Что выбрать?

Требования к программе могут быть разные, поэтому, сразу ответить что лучше нельзя, все исходит из потребностей, но ничто не мешает использовать и SAX и DOM парсер  одновременно в одном и том же проекте.

Tennis Anime — программа на OpenGL для моделирования игры в теннис

Tennis Anime —  программа, которая анимирует процесс игры в теннис. Программа реализована на графической библиотеке OpenGL на платформе Win32. Есть возможность управления движения видовым экраном в пространстве с помощью стрелок Вверх, Вниз, Влево, Направо. Написан на C++ в среде Visual Studio 2010. Основной целью данной программы является демонстрация движения мяча в воздухе и движение ракеток.

tennis-anime

Для создания временных интервалов движения мяча в программе используется таймер. Движение мяча в пространстве от ракетки описывается формулой горизонтально брошенного тела, а отскок от земли — формулой движения тела под углом.

Safe Manager — программа для изменения атрибутов файлов

Safe Manager — программа для Windows, которая помогает устанавливать или изменять атрибуты любого файла. С помощью данной программы вы можете также скрывать файлы на компьютере под пароль, возведя файл в собственный формат программы .smf и извлекать их из сейфа, введя поставленный пароль. С помощью атрибутов можете скрывать файл на компьютере, установив атрибут Hidden, а также запретить его удалять с компьютера установив атрибут System. Программа очень легкая и весит от силы 1 Мгб и со скромными потребностями .NET 3.5 или выше.

Prewiev Image

Примечание: При скрытии файла имейте в виду, что увидеть его и изменить его атрибут на видимый можно, в дальнейшем,  через настройки папок и файлов Windows(Панель управления\Все элементы панели управления\Параметры папок) сняв галочку с пункта Скрывать защищенные системные файлы.

Решаем проблему нерабочих USB на Windows 7

Операционная система взаимодействует с железом с помощью прослойки драйверов. Драйверы  — это программные модули, которые напрямую работают с модулями железа и как ни странно их тоже нужно обновлять, когда обновляется модули ОС или модули железа. Проблема нерабочих USB может произойти, отчасти, от разных ситуаций:

  • Обновили какое-то физическое устройство на ПК;
  • Обновили ОС или модуль ОС;
  • Переустановка ОС;
  • Неудачная работа с реестром;
  • Неудачная работа с папкой C:\Windows\System32;
  • Автоматический сброс в USB : Disable в BIOS;

Одним из основных путей решения данной проблемы состоит из 3-х шагов:

  1. Скачиваем и устанавливаем любую, зарекомендованную, программу обновления и установки драйверов. Один из кандидатов  — Driver Booster:

Driever BoosterПосле установки обновляем все устаревшие драйвера и устанавливаем отсутствующие, далее перезагружаем компьютер;

2.  Заходим в реестр Windows через специализированную программу или через стандартный редактор реестра выполнив команду regedit.exe в строке пуск:

reg-edit-winЗапускаем этот редактор и находим в дереве реестра ветку HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{36FC9E60-C465-11
CF-8056-444553540000} , нажимая на которую в правой части выводятся соответствующие ей параметры и их значения:

reg-param-value

 

Там же(в правой части) смотрим, нет ли параметров LowerFilters и UpperFilters, если они есть, то удаляем их;

3. Перезагружаем комп и на этапе загрузки циклично нажимаем на  кнопку F2 или Delete, чтобы зайти в BIOS. Зайдя в BIOS находим пункт, где конфигурируется USB, на разных операционках может отличаться данный пункт. В BIOS находим пункт Integrated Peripherals в Award BIOS или пункт Advanced в Ami BIOS , наводя на них метку жмём Enter,   заходим в USB Configuration и проверяем стоит ли USB в положении Enabled, если USB в Disabled, то меняем на Enabled;

Далее выходим из BIOS и USB должен заработать. Может получиться так, что 3-го этапа и не понадобиться — смотря что за ситуация именно у вас.

 

 

 

1.Введение в Android

Данные и последующие темы данной рубрике будут ориентированы на программистов, которые хотят освоить для себя новую мобильную платформу Android. По ходу пьесы будут затрагиваться основные моменты, на которые следует остановиться начинающему разработчику Android и это поможет избежать путаницы. Для разработки существуют фирменные наборы SDK android с IDE Eclipse на основе ADT(Android Development Tools)-плагина. Почему выбран IDE Eclipse? Потому что в Гугл решили выпустить собственную реализацию IDE, добавив к Eclipse свои инструменты с набором Android SDK и является Open Source, поэтому никому ничего ненадо платить. Недавно был релиз нового фирменного IDE на основе IntelliJ IDEA Open Source -версии. Новая Android-студия представляет собой подобно Eclipse с ADT Plugin, Android-студия предоставляет интегрированные Android средства разработки для разработки и отладки. Кроме возможностей, которые вы ожидаете от IntelliJ, Android-студия предлагает:

  • Gradle -поддержка сборки;
  • Android-специфичный рефакторинг и быстрое решение;
  • Lint-инструменты для анализа производительности, удобство использования, решения совместимости версий и другие проблемы;
  • ProGuard и приложение с возможностью подписи;
  • Мастера на основе шаблонов для создания общих конструкций и компонентов Android;
  • Визуальный редактор макета, который позволяет перетаскивать и вставлять компоненты пользовательского интерфейса, просматривать макеты на нескольких конфигурациях экрана и многое другое;
  • Встроенная поддержка для Google Cloud Platform , что позволяет легко интегрировать Google Cloud сообщения и App Engine как серверные компоненты;

В настоящее время очень много новых IDE, которых выталкивают на рынок сторонние разработчики, как правило они охватывают не узкий сегмент одного лишь Android, а комплекс различных платформ, т.е. пишешь один раз и получаешь для всех(Windows Phone, iOS, Android …). Я не думаю, что, если вы начинающий программист, то вам следует начать с них, конечно, они вам дают удобный и понятный интерфейс, который, из-за своей «сырости», редко пригоден для полноценной разработки в дальнейшем и мало того, вам еще потребуется за это платить, когда ваше понимание в Android увеличится за пределы Free -релиза. Ниже привожу список основных IDE и плагинов, которые, на данный момент участвуют на рынке мобильного ПО:

  1. Codename One — Open Source плагин для Eclipse, Net Beans, IntelliJ IDEA, есть платная версия, которая исключает ограничение в количестве раз компиляции исходного кода. На данный момент идет полным ходом его усоверщенствование и поиск багов. Имеет очень большую перспективу, так как в основе данной разработки лежит лозунг Java: «Напиши один раз, запускай везде» и действительно, данное детище позволяет писать один код и компилировать его под Android, iOS, JME, Win Phone, Mac OS, Windows, RIM. При компиляции происходит создание нативного кода под ту или иную ОС. Код компилируется на сервере разработчиков и для этого придется зарегистрироваться на сайте www.codenameone.com;
  2. Xamarin Studio — полноценная IDE для разработки приложений на C#. Позволяет писать нативный код под Android, iOS,  Win Phone. Не является бесплатной;
  3. RAD Studio XE5 — это среда разработки native-приложений для рабочих групп, которая позволяет быстро создавать приложения для Android и iOS, загружать их в магазины приложений и внедрять в организациях. Данная среда позволяет писать код на C++ и Delphi. Не является бесплатной;

Стартовый код OpenGL /Win32

Часто бывает, особенно у новичков, что когда-то занимались на OpenGL, но забыли как написать начальный код для OpenGL приложения. Ниже представлен шаблонный код для дальнейшего развертывания графической библиотеки OpenGL. Конечно, Win32— приложения сейчас используются не столь популярностью, как раньше, но на на Win32 до сих учатся и программируют в учебных целях. Особенностью работы с OpenGL в Win32 является простота.

Легче, при разрастании кода, разделить главный исходный файл на несколько файлов с заголовками, чтобы не путаться в одном большом коде, как говориться : «Разделяй и властвуй!» :).

/*
*WebSofter MG
*/

#include <windows.h>
#include <math.h>

#include <gl/gl.h>
#include <gl/glu.h>

#include "glut.h"
#include "glaux.h"

#pragma comment(lib, "glut32.lib")//Подключаем библиотеку Glut
#pragma comment(lib, "Glaux.lib")//Подключаем библиотеку Glaux

HWND hWnd;
HGLRC hGLRC;
HDC hDC;



int SetWindowPixelFormat()
{
    int m_GLPixelIndex;
    PIXELFORMATDESCRIPTOR pfd;


    pfd.nSize       = sizeof(PIXELFORMATDESCRIPTOR);
    pfd.nVersion    = 1;

    pfd.dwFlags   = PFD_DRAW_TO_WINDOW | 
                    PFD_SUPPORT_OPENGL | 
                    PFD_DOUBLEBUFFER;

    pfd.iPixelType     = PFD_TYPE_RGBA;
    pfd.cColorBits     = 32;
    pfd.cRedBits       = 8;
    pfd.cRedShift      = 16;
    pfd.cGreenBits     = 8;
    pfd.cGreenShift    = 8;
    pfd.cBlueBits      = 8;
    pfd.cBlueShift     = 0;
    pfd.cAlphaBits     = 0;
    pfd.cAlphaShift    = 0;
    pfd.cAccumBits     = 64;    
    pfd.cAccumRedBits  = 16;
    pfd.cAccumGreenBits   = 16;
    pfd.cAccumBlueBits    = 16;
    pfd.cAccumAlphaBits   = 0;
    pfd.cDepthBits        = 32;
    pfd.cStencilBits      = 8;
    pfd.cAuxBuffers       = 0;
    pfd.iLayerType        = PFD_MAIN_PLANE;
    pfd.bReserved         = 0;
    pfd.dwLayerMask       = 0;
    pfd.dwVisibleMask     = 0;
    pfd.dwDamageMask      = 0;



    m_GLPixelIndex = ChoosePixelFormat( hDC, &pfd);
    if(m_GLPixelIndex==0) // Let's choose a default index.
    {
     m_GLPixelIndex = 1;    
     if(DescribePixelFormat(hDC,m_GLPixelIndex,sizeof(PIXELFORMATDESCRIPTOR),&pfd)==0)
       return 0;
    }


    if (SetPixelFormat( hDC, m_GLPixelIndex, &pfd)==FALSE)
        return 0;


    return 1;
}




void resize(int width,int height)
{
    glViewport(0,0,width,height);
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    glOrtho(-5,5, -5,5, 2,12);    
    gluLookAt( 0,0,5, 0,0,0, 0,1,0 );
    glMatrixMode( GL_MODELVIEW );
}    

int DrawGLScene(GLvoid)//Здесь будет весь код OpenGL объектов
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();
	glTranslatef(0.0,0.0,1.0);//Настраиваем координаты	

	glPushMatrix();
	  auxSolidSphere(2.5f);//Выводим сферу
        glPopMatrix();

	return TRUE;
}


void display()
{
  glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

  	/* remove next tree lines
	 * and enter your code here
	 */
     DrawGLScene();

  glFinish();
  SwapBuffers(wglGetCurrentDC());
}




LRESULT CALLBACK WindowFunc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
float pos[4] = {3,3,3,1};
float dir[3] = {-1,-1,-1};
PAINTSTRUCT ps;

switch(msg)
	{

	case WM_CREATE:
	hDC = GetDC(hWnd);
	SetWindowPixelFormat();
	hGLRC = wglCreateContext(hDC);
	wglMakeCurrent(hDC, hGLRC);

    glEnable(GL_ALPHA_TEST);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    glLightfv(GL_LIGHT0, GL_POSITION, pos);
    glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dir);

        break; 

    
	case WM_DESTROY:
	if (hGLRC) 
	{
	    wglMakeCurrent(NULL, NULL);
	    wglDeleteContext(hGLRC);
	}
	ReleaseDC(hWnd, hDC);
	PostQuitMessage(0);
	break;

	
	
	case WM_PAINT:
	BeginPaint(hWnd, &ps);
	display();
	EndPaint(hWnd, &ps);
	break;
	

    
	case WM_SIZE:
	resize( LOWORD(lParam), HIWORD(lParam) );
	break;  


       default:
	return DefWindowProc(hWnd,msg,wParam,lParam);
	}

return 0;
}




int WINAPI WinMain(HINSTANCE hThisInst,
				   HINSTANCE hPrevInst,
				   LPSTR str,int nWinMode)
{
MSG msg;
WNDCLASS wcl;


wcl.hInstance=hThisInst;
wcl.lpszClassName = L"OpenGLWinClass";
wcl.lpfnWndProc = WindowFunc;
wcl.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;

wcl.hIcon = NULL;
wcl.hCursor = LoadCursor(NULL,IDC_ARROW);
wcl.lpszMenuName = NULL;

wcl.cbClsExtra = 0;
wcl.cbWndExtra = 0;

wcl.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
RegisterClass(&wcl);


hWnd = CreateWindow(L"OpenGLWinClass", L"Win API Template", 
					 WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
					 200,
					 150,
					 400,
					 420,
					 HWND_DESKTOP, NULL,
					 hThisInst, NULL);


ShowWindow(hWnd,nWinMode);
UpdateWindow(hWnd);


while(1)
{
  while( PeekMessage(&msg,NULL,0,0,PM_NOREMOVE) ) 
    if(GetMessage(&msg,NULL,0,0))
     { 
      TranslateMessage(&msg);
      DispatchMessage(&msg);
     }
    else
      return 0;

  display();
} 


return 0;
}

Вы можете работать со стандартными библиотеками OpenGl, это:

#include <gl/gl.h>
#include <gl/glu.h>

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

#include "glut.h"
#include "glaux.h"
#pragma comment(lib, "glut32.lib")//Подключаем библиотеку Glut
#pragma comment(lib, "Glaux.lib")//Подключаем библиотеку Glaux

Чтобы подключить их, вам нужно скачать последние версии glut32.lib/glut.h и glaux.lib/glaux.h и закинуть их в ту же директорию, где ваш файл запуска главной функции WinMain, т.е. вышеприведенный.

5. ООП в PHP5. Константы в классах

Бывает так, что объект имеет постоянные характерные для себя значения, допустим, значение PI=3.14, E=2.7, G=8.9 и т.д. И для сохранения подобных констант нам необходимо будет создать константы в классе.

Для создания константы используется ключевое слово const и дальше пишется название константы без знака $, так как это уже будет как признак переменной. Еще принято писать константы в верхнем регистре в остальном не должны начинаться с цифр или содержать спец-символ, кроме символа подчеркивания и еще одна особенност констант — в том, что их сразу же надо объявлять при создании и это значение всегда будет в нем оставаться. Конечно, можно переопределить константу через функцию define(), здравый смысл подсказывает, что делать этого нельзя, хотя, решать вам :).

После того, как мы определили константу к нему еще надо обратиться через объект, но так как это не переменна, то доступ к константе и для этого существуют 4 способа, 2 из которых задействован начиная с PHP 5.3.

1. Доступ внутри класса — способ, при котором к константе можно обратиться через ключевое слово self:: или через название класса:


class MyClass{
  const MY_CONST = 3.14;
  public function myMethod()
  {
     echo self::MY_CONST + MyClass::MY_CONST;// Будет все равно, что 3.14*2
  }
}

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

MyClass::MY_CONST

который мы уже использовали выше;

3. Другой вариант — более новый, который поддерживается с версии 5.3 -‘это через имя объекта, если у нас есть несколько объектов(экземпляров) одного и того же класса, то через все эти объекты мы можем обратиться к ,определенной в данном классе, константе и значение всегда будет одно и то же, независимо какой объект, вот к примеру:


$newObj_1=new MyClass();
$newObj_2=new MyClass();
echo $newObj_1::MY_CONSTANT;//3.14
echo $newObj_2::MY_CONSTANT;//3.14

4. Еще один интересны способ — через строчное название класса, который поддерживается с версии 5.3 ,то есть определяем переменную с названием класса и через эту переменную обращаемся и вот как это выглядит:


$newVar_1="MyClass";
$newVar_2="MyClass";
echo $newVar_1::MY_CONSTANT;//3.14
echo $newVar_2::MY_CONSTANT;//3.14

Вот и все особенности констант в ООП PHP :).

4. ООП в PHP5. Свойства класса

Настало время поговорить о свойствах класса(или полях). Если в ООП класс описывает какую-то сущность, реальный объект, то он, чтобы описать этот объект должен содержать некие переменные, в которых находятся количественная харектиристика того или  иного объекта в действии. Допустим, у нас есть класс фигуры круга, то каждый экземпляр должен содержать свойства данной фигуры -цвет, координаты, размер радиуса в различных местах его использования вот для таких целей нам и нужны переменные(свойства).   Каждое свойство может иметь один из 3 модификаторов доступа — public, protected и private:

 
class Circle{
       public $x=0;
       protected $z=0;
       private $y=0;
//Методы для установки данных
public function setX($new_x)
{
$this->x=$new_x;
}
public function getY($new_y)
{
$this->y=$new_y;
}
public function getZ($new_z)
{
return $this->z=$new_z;
}

//Методы для получения данных
public function getX()
{
return $this->x;
}
public function getY()
{
return $this->y;
}
public function getZ()
{
return $this->z;
}
}

//Создадим объект
$newObj=new Circle();
/*1 способ установки и получения значений свойств для объекта*/
//Зададим свойства через метод установки
$newObj->setX(1);//Можно-через метод можно задать значение открытому св-ву
$newObj->setY(2);//Можно-через метод можно задать значение защишенному св-ву
$newObj->setZ(3);//Можно-через метод можно задать значение закрытому св-ву
//Получим свойства через методы возврата
echo $newObj->getX(1);//Можно-через метод можно получить значение открытого св-ва
echo $newObj->getY(2);//Можно-через метод можно получить значение защишенного св-ва
echo $newObj->getZ(3);//Можно-через метод можно получить значение закрытого св-ва
/*2 способ установки и получения значений свойств для объекта*/
//Зададим свойства через сам объект
$newObj->x=1;//Можно-через объект можно задать значение открытому св-ву
$newObj->y=2;//Нельзя-через объект нельзя задать значение защишенному св-ву
$newObj->z=3;//Нельзя-через объект нельзя задать значение закрытому св-ву
//Получим значения свойств через объект
echo $newObj->x;//Можно-через объект можно взять значение открытого св-ва
echo $newObj->y;//Нельзя-через объект нельзя взять значение защишенного св-ва
echo $newObj->z;//Нельзя-через объект нельзя взять значение закрытого св-ва

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

Разница между интерфейсом и абстрактным классом

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

Итак, давайте разберемся с основными понятиями иначе, зачем нам работать на интсрументе, название которого нам непонятно, не так ли? 🙂

Интерфейс (interface) — это некая совокупность возможностей или методов выполнения операций над объектом или объектами;

Абстракция (abstraction) -придание сущности или объекту некоторых конкретных черт, отвергая при этом несущественных;

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

Именования интерфейсов и абстрактных классов

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

При создании интерфейса им следует давать названия , которые описывают возможности объекта, которые могут обозначать прилагательное или причастие речи,к примеру : Flexible(изгибающийся),  Comparable(сравнимый), Sizeable(масштабируемый) и т.д.

При создании абстракции мы должны исходить из родительской сущности, да, именно из родительской, так как, если мы создаем абстрактный класс, то обязательно на его основе создаем наследование и переопределение его свойств иначе его смысл в ООП потерялся бы и для этого можно использовать существительное,к примеру: Car(машина), Figure(фигура), Wear(одежда), а конкретные реализации, допустим от Car, мы уже будем реализовывать при наследовании через обычные класс.

 

Связь триединства сущности — интерфейс, абстракция, класс.

Теперь давайте подумаем над тем, как формируется связь со всеми этими понятиями. Класс — это конечная возможность любой сущности, вот к примеру: кенгуру не может быть родителем другого класса животных, но он может быть классом сумчатых и класс сумчатых можно реализовать как интерфейс. Еще кенгуру умеет прыгать, пить, есть, размножаться и тогда логично добавить еще интерфейс его возможностей.

Покажем пример:


//Определим абстракцию фигуры
abstract class Figure{
    public $width,$x,$y,$z = 0;
    protected $hight = 0;
    private $size =0;

    const E = 2.7;

    abstract public function fit();
    public function setX($x)
        {
            $this->x=$x;
        }

}
//Определим интерфейс для фигур
interface Sizeable{
    const PI = 3.14;
    function setSize($scale);
}
//
interface Fitable{
    const WHITE = "FFFFFF";
    function setColor($color);
}
//Создадим конкретную сущность, удовлетворяющий вышеописанным условиям
class Rectangle extends Figure implements Sizable, Fitable{

   public function setSize($scale)
     {
           return ['witdh'=>($scale*$this->width),'hight'=>($scale*$this->hight)];
     }
   function setColor($color)
     {
           echo "Setting clor with code ".$color;
     }
}

Основные положения из этого всего.

Основные положения при создании абстрактного класса

1. Абстрактный класс и абстрактный метод создаются с помощью ключевого слова abstract;
2. Абстрактный класс обязательно должен содержать в себе хотябы один абстрактный метод;
3. Реализация абстрактного класса происходит через ключевое слово extends;
4. Класс может реализовать только один абстрактный класс;
5. Абстрактный класс, в отличии от интерфейса, может содержать реализованные методы;
6. Как и обычный класс может содержать поля, константы и методы с реализацией;
7. Абстрактные методы и поля можно объявлять с идентификаторами доступа public, protected, private и ,при реализации в классе, методы должны иметь такой же модификатор или менее ограниченный;
8. Абстрактные методы должны быть указаны явно через ключевое слово abstract;
9. При наследовании все методы, помеченные как абстрактные, должны быть реализованы в классе -потомке и ,при этом , область видимости этих методов должна совпадать (или быть менее строгой);
10. Сигнатуры , реализуемых в классе-потомке, методов должны совпадать, т.е. контроль типов и количество обязательных аргументов должно быть одинаковым;
11. Если в дочернем классе указан необязательный параметр, которого нет в сигнатуре абстрактного класса, то в данном случае конфликта сигнатур не будет. Это правило также применяется к конструкторам начиная с версии PHP 5.4. Это говорит о том, что, если в абстракции у нас метод с 2-мя аргументами, то в наследуемом классе мы можем переопределить этот метод с двумя аргументами или добавить еще, но никак не меньше;
12. Нельзя создать экземпляр или объект абстрактного класса;
13. Методы, объявленные как абстрактные не могут не могут нести реализацию , они имеют только опистельный смысл и должны быть обязательно реализованы в классе наследующим абстракцию;

Основные положения при создании интерфейса

1. Класс не может реализовать 2 интерфейса, у которых одинаковые методы ибо возникнет неоднозначность вызова;
2. Интерфейсы могут быть унаследованы друг от друга, так же как и классы, с помощью оператора extends;
3. Сигнатуры(т.е. количество передаваемых переменных и название метода) методов в классе, реализующем интерфейс, должны точно совпадать с сигнатурами, используемыми в интерфейсе, в противном случае будет вызвана фатальная ошибка;
4. Интерфейсы могут содержать константы. Константы интерфейсов работают точно так же, как и константы классов, за исключением того, что они не могут быть перекрыты наследующим классом или интерфейсом, иначе говоря не могут быть переопределены;
5. Все методы интерфейса, по умолчанию, являются абстрактными;
6. Все методы интерфейса, по умолчанию, являются публичными;
7. Интерфейс не может реализовать содержащиеся в нем методы, реализует наследующий класс;
8. Класс может наследовать интерфейс через ключевое слово implements;
9. Класс может реализвовать и наследовать несколько интерфейсов через запятые и названия интерфейсов;
10. Класс, реализующий интерфейс, должен обязательно реализовать код для всех методов наследуемого интерфейса;