twgt: Вчитайся в следующий код. Обрати внимание на Private и Protected методы Код (Text): /* * SystemConnector.java * * Класс SystemConnector создан 25 Сентябрь 2007 г., 14:48 * * ------------------ ОПИСАНИЕ МОДУЛЯ ------------------ * SystemConnector * * Это такая штука, которая позволяет юзать внешние проги для расширенного взаимодействия с системой * Ну, типа, прог на асме, паскале, PHP.... * Можно, к примеру, с MySQL базой побазарить внатуре. * */ package ehost; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.MappedByteBuffer; import java.nio.channels.*; import java.nio.channels.FileChannel.MapMode; import java.io.*; import java.util.*; /** * * @author root * Чисто конкретно будем тут юзать каналы ввода-вывода с трубами (PIPES). */ public class SystemConnector { public static final int EXTERNAL_PROG_TYPE = 1; public static final int PHP_SCRIPT_TYPE = 2; /** Creates a new instance of SystemConnector */ private Object ExtendedAbstractEXpressor; private Object ExtendedBaseEXpressor; private int ExtendedCounterEXpressor; private int ExtendedDisposerEXpressor; private int ExtendedStackIndex; private int ExtendedDurationIndex; private int ExtendedStackPointer; private int ExtendedBasePointer; private Stack STACK; private boolean ErrorFlag; private int CurrentType; public SystemConnector( int type) { CurrentType=type; // Выставляем нули. ExtendedAbstractEXpressor = new Object(); ExtendedBaseEXpressor = new Object(); STACK = new Stack (); //************************************************ STACK.push("Hello, World!"); console_write(); if (ErrorFlag){ ExtendedDisposerEXpressor = 1; exit_system(); };; ExtendedDisposerEXpressor = 0; get_free_mem(); STACK.push(ExtendedAbstractEXpressor); console_write(); stop_now(); } public void connectTo(String what){ STACK.push(what); ExtendedAbstractEXpressor = 0; ExtendedBaseEXpressor = 0; } public void callProc(String proc){ } private void console_write(){ try{ System.out.println(STACK.pop()); ErrorFlag = false; }catch (Exception e){ ErrorFlag = true; } } private void stop_now(){ finalize(); } protected void finalize(){ STACK.clear(); STACK.push ("(HALT)"); console_write(); } private void exit_system(){ System.exit(ExtendedDisposerEXpressor); } private void get_free_mem(){ ExtendedAbstractEXpressor = Runtime.getRuntime().freeMemory(); } private void get_full_mem(){ ExtendedAbstractEXpressor = Runtime.getRuntime().maxMemory(); } public static void main(String[] args){ new SystemConnector (SystemConnector.EXTERNAL_PROG_TYPE); } }
device Вчитался. Только не совсем понял что нового должен был увидеть. Если имелось ввиду что private может вызываться только внутри класса, а public вне его, то это мне известно. Это: было только предположение
по мне так это удобно очень когда приходится писать какие-то библиотеки совсем абстрагированные от конкретной задачи, так вот чтобы их отделить от целефого приложения как можно сильнее и нужно ООП.
Я конечно не учил Java, но зато я хорошо знаю C# (мутагенез Java/C++ если не ошибаюсь . Они во многом похожи (в смысле язык C# и Java). Сейчас попробую обьяснить что к чему: Само название Объектно-Ориентированное Программирование, говорит о том, что при программировании под ООП, будешь работать с объектами. Объектом является переменная чей тип соответствует какому-то классу (сам класс не является объектом, это шаблон). Как правило класс может унаследовать другой класс (все методы, переменные, свойства). Существует множественное наследование (к примеру в C++). В технологии .NET можно унаследовать только один класс, множественное наследование реализовано только для интерфейсов (вспоминаем COM-технологию, .NET это логическое продолжение данной технологии). Методы класса - и есть простые процедуры, свойства - тоже процедуры. Сам класс, можно считать структурой объекта. Основные действия с объектом - создание, вызов методов, чтение и запись свойств, уничтожение (ничего не напоминает?). ООП - отображает логику человека (сначала мы что-то создадим, потом попользуемся этим предметом, потом отдадим в утиль, или сами уничтожим), мы работаем с объектами, как и в жизни. К примеру: Код (Text): enum MemoryCardModel : int { None, MC4DF, MC4SD, MC8SD } enum MemoryCardColor : int { None, Black, White, Silver, Gray, Green } class MemoryCard { public MemoryCard() // Конструктор класса { // Конструктор вызывается при создании объекта, позволяя // инициализировать объект. MCDevice.OutStateCard // Вызов статического метода класса MCDevice. (ref size, ref model, ref color, ref speed); } ~MemoryCard() // Деструктор класса { // Деструктор вызывается при уничтожении объекта, позволяя // освободить все занятые объектом ресурсы. size = 0; model = MemoryCardModel.None; color = MemoryCardColor.None; speed = 0; } private int size; // Размер памяти private MemoryCardModel model; // Модель карты private MemoryCardColor color; // Цвет карты private int speed; // Скорость чтения/записи public int Size // Свойство - размер памяти, доступен только для чтения { get { return size; } } public MemoryCardModel Model // Свойство - модель карты, доступен только для чтения { get { return model; } } public MemoryCardColor Color // Свойство - цвет карты карты, доступен только для чтения { get { return color} } public int Speed // Свойство - скорость R/W, доступен только для чтения { get { return speed; } } } // А вот аналог регистра eax [StructLayout(LayoutKind.Explicit)] class EAX { [FieldOffset(0)] private uint _eax; [FieldOffset(0)] private ushort _ax; [FieldOffset(1)] private byte _ah; [FieldOffset(0)] private byte _al; public uint Value { get { return _eax; } set { _eax = value; } } public ushort AX { get { return _ax; } set { _ax = value; } } public byte AH { get { return _ah; } set { _ah = value; } } public byte AL { get { return _al; } set { _al = value; } } } // Если у кого есть .NET, можете проверить static void Main(string[] args) { EAX eax = new EAX(); eax.Value = 0xAABBCCDD; Console.WriteLine("eax = {0}\r\nax = {1}\r\nah = {2}\r\nal = {3}", eax.Value.ToString("X"), eax.AX.ToString("X"), eax.AH.ToString("X"), eax.AL.ToString("X")); Console.ReadLine(); } В заключении могу сказать, что помимо методов, свойств, переменных у класса есть операторы (new и delete, =, ==, +, -, /, *, etc...) которые могут быть перегружены. Также класс может содержать статические методы, переменные, свойства (что-то типа глобальных), но они не относятся к объекту. В принципе можно сделать из класса статический объект.
На дату создания надо смотреть, ребятки Я уже понял в чём их смысл и, по секрету, вопрос мой был касательно PHP.(Хотя понял, когда пролистывал книгу Страуструпа - Дизайн и эволюция языка С++)
Майкрософт, казел, нарушает принципы оформления кода. В ООП Ссвойство пишут с большой буквы, а метод - с маленькой. То есть не ToString(), a toString();;
t00x Извините, но бугага)) Смысл классов далеко не в этом)) device Извините, но бугага-2)) Это с чего вдруг у нас появился Главный Стиль? Ты стилистику stl или boost видел? Тоже казлы?
_DEN_ тогда назовите ещё какую-нибудь абстракцию в программировании, поддерживающую механизм наследования не говоря о том, что конечно же, смысл классов как таковых не содержится в слове "наследование".
_DEN_ наследование непосредственно относится к объектно-ориентированному программированию, а в частности к классам.
t00x Ну да, наследование - один из, так скажем, механизмов, существующих в ООП. Хороший или плохой - вопрос сейчас не в этом. Вопрос в том, точнее утверждение в том, что это далеко не главный механизм, как сказал ты.
Весь смысл ООП, как и причина его создания, попытка реализовать систему управления большими проектами. Наследование, как частный случай, мечта использовать старый код в новых пректах. Этакая бесконечная пирамида, что в теории должно экомонить массу времени и денег на разработку. //------- И это все. А рекламные ролики, про детей и родителей, про сущность объекта и других магических слов, оставим разбирать философам.
_DEN_ если под выражением "главный механизм" имелось в виду "смысл классов", то не надо путаться самому и путать других, потому как в #30 написано: а в #4 так вообще не присутствует синонимов слова "главный". P.S. наследование - это один из механизмов, направленных на поддержание выживания вида.
_DEN_ Ну это не скажи, иногда оно архитектурно очень даже оправдано. Например базовый класс предоставляющий базовую функциональность, а потомки только децел её изменяют, добавляют. Опять таки базовый класс с виртульными методами каллбэками. Базовый вызывает эти каллбэки, а потомок получает из них данные. Так например многие парсеры делаются, по-мойму красота. Так что это не просто реиспользование старого кода, а и способ сделать архитектуру гибче.
Booster Ага, и в итоге имеем сквозные зависимости по дереву, что намертво связывает систему, и любое тыканье пальцем в нее преващается в долгий и нудный рефакторинг. Наследование как парадигма - программирование 1980-х годов.
Booster Были времена, когда проект состоял из одного файла и над ним работал один программист. Там не было функций и процедур, а были подпрограммы. Когда ПО усложнилось появился процедурный подход. Подпрограммы стали функциями, появилось много файлов и над проектом сиогли работать несколько прогр. Но ПО вск усложнялось. И управлять проектом, в котором немеренная туча файлов стало сложно. Появилось необходимость объеденить, со схожим функ. Так появился класс. Если раньше мы раньше мы просто вызывали функцию, то появилась необходимость в другом механизме вызова. Так появилось наследование. И т.д. //------ Скажи, когда ты включаешь заголовочный файл какой нибудь либы, написанной на чистом С, есть ли кардинальные различия с ООП? Создавая новую функцию, в которой ты используешь что -то из либы, разве ты не переопределяешь методы? И не создаешь новую, используя (наследуя) свойства прежних? //------ Красота редкое явление в ООП, потому как красивое проектирование классов чертовски сложная задача.
vito Сейчас мы придём к тому что OOП нах не нужно -). Я не спорю что всё что можно сделать с ООП, можно сделать и без него, и при этом архитектуру выдержать нормальную. Но сдаётся мне, что архитектура эта всё же будет смахивать на ООП. ООП в компиляторах это просто развитие и поддержка идей ООП на уровне этого самого компилятора, чего можно добится и без этой поддержки. А сделать какашку можно где угодно и чем угодно. Но лично для себя я выбрал ООП, правда на грабли огромного кол-ва классов, наследований и т.д уже приходилось наступать. Так что проектирование конечно чертовки важная вешь. -).