Мой родственник изучает программирование и с трудом понимает занятия. Например, у него проблемы с пониманием того, что вам нужно создать его экземпляр, что методы не могут получить доступ к переменным в других методах, и если вы изменяете переменную в одном экземпляре класса, она не изменяется для других экземпляров.
Я пытался использовать аналогии, например, определение класса похоже на проект дома. И экземпляры домов сделаны из этого плана.
Как вы объясните классы и ОО в целом?
Серьезно используйте Животных, это работает отлично. И это - то, что закрепило понятие для меня несколько лет назад. Просто найденный этим кодом C#. Это кажется хорошим
// Assembly: Common Classes
// Namespace: CommonClasses
public interface IAnimal
{
string Name
{
get;
}
string Talk();
}
// Assembly: Animals
// Namespace: Animals
public class AnimalBase
{
private string _name;
AnimalBase(string name)
{
_name = name;
}
public string Name
{
get
{
return _name;
}
}
}
// Assembly: Animals
// Namespace: Animals
public class Cat : AnimalBase, IAnimal
{
public Cat(String name) :
base(name)
{
}
public string Talk() {
return "Meowww!";
}
}
// Assembly: Animals
// Namespace: Animals
public class Dog : AnimalBase, IAnimal
{
public Dog(string name) :
base(name)
{
}
public string Talk() {
return "Arf! Arf!";
}
}
// Assembly: Program
// Namespace: Program
// References and Uses Assemblies: Common Classes, Animals
public class TestAnimals
{
// prints the following:
//
// Missy: Meowww!
// Mr. Bojangles: Meowww!
// Lassie: Arf! Arf!
//
public static void Main(String[] args)
{
List<IAnimal> animals = new List<IAnimal>();
animals.Add(new Cat("Missy"));
animals.Add(new Cat("Mr. Bojangles"));
animals.Add(new Dog("Lassie"));
foreach(IAnimal animal in animals)
{
Console.WriteLine(animal.Name + ": " + animal.Talk());
}
}
}
И как только он имеет, это закрепило, Вы бросаете вызов ему определять Bird (муха), и затем Пингвин (муха!?)
Как все старперы, я хотел бы ответить на это с историей от моей собственной жизни.
я начал программировать основной на VIC-20. Не зная ничто больше, я, хотя это было то, как были запрограммированы все компьютеры. Я думал, что было немного трудно отслеживать, которых имен переменной я использовал и которые были все еще свободны, (проблема объема). Я также думал, что было трудно разделить мою программу на повторяемые блоки с помощью gosub-возврата и установив и читая переменные, которые они будут использовать, (отсутствие методов).
Тогда я вошел в Turbo C по MS-DOS. Теперь я мог создать свои собственные методы и функции! Я больше не застревал со старым конечным множеством команд в основном. Я чувствовал, что создавал новый язык для каждой программы, которую я записал. C дал мне более выразительное питание.
C++ был первым объектно-ориентированным языком, о котором я слышал. Большой момент для меня был, когда я понял, что мог создать свои собственные типы данных, и даже перегрузить операторы. Снова, было такое чувство, что я мог создать свой собственный язык, содержащий и новые функции и типы данных, вместе с операторами.
Это - то, как я продал бы OO новому программисту. Объясните, что это дает выразительное питание, потому что они могут определить свои собственные типы данных. Я всегда думал, что инкапсуляция была лучшим коммерческим аргументом, чем наследование.
Читайте учебные руководства по Java для некоторых хороших идей и примеров реального мира.
static const
переменная не является константным выражением как you' d нужно для размера массива, например. Я предполагаю that' s, почему #define
с более популярны в C.
– sellibitze
24 February 2010 в 20:11
Если они являются достаточно взрослыми, чтобы когда-либо заполнить налоговую форму, покажите им 1040EZ и объясните, что экземпляр класса похож на заполненную форму: каждый пробел является членской переменной объекта, и форма также включает инструкции для того, что сделать с членскими переменными, и те инструкции являются функциями членства объекта. Сам класс похож на основную копию формы, от которой можно распечатать от бесконечного количества незаполненных бланков для заполнения.
Одна вещь, которой я порекомендовал бы к , ИЗБЕГАЕТ в попытке связаться, понятие OO новым программистам использует только примеры, где объекты (в смысле OO) представляют реальные физические объекты. Это на самом деле сделает студентов [еще 113] перепутанный, когда они встретятся, объекты раньше представляли нефизические объекты (такие как цветовая схема, или большинство поведенческих моделей в "Шаблонах разработки") или объекты, используемые в качестве полезного пути к связанным с хранилищем функциям и связанным данным в том же месте (думают java.lang Java. Математика для примера.)
const
переменные?
– John Bode
31 May 2018 в 19:06
Игры хороши. Существуют gameobjects, от этого обносит стеной, враги и игроки наследовались. gameobjects должен быть renderable, имеют логику коллизии и т.д. Враги имеют ай логичный, в то время как плеер является клавиатурой, которой управляют.
Некоторые элементы UI также хороши, существуют кнопки, inputboxes и т.д., который все наследовали от некоторого baseobject, который имеет код для управления событиями от нажатия мыши и т.д.
, мне не нравится пример животных, потому что я никогда не видел "реальную" программу, которая когда-либо имела к использованию животных таким образом. Это только заставит людей использовать наследование повсеместно, и Вы закончите с кубами, наследовавшимися прямоугольникам, которые наследовались строкам (почему делает столько книг, настаивают на том, чтобы использовать это в качестве примера?).
лучшая книга, которую я имею когда-либо на объектно-ориентированном программировании, "Объектно-ориентированная Конструкция программного обеспечения Betrand" - если Вы действительно хотите получить основы, нет никакого пути вокруг этого.
Лучшим способом я добрался, это до моей жены (бухгалтер - эксперт) следующие.
В 'регулярном' программировании у Вас есть данные (вещи, которыми управляют), и код (вещи, которые управляют), и они являются отдельными. Иногда Вы перепутаны, потому что определенная часть кода пытается управлять неправильной вещью.
В случае моей жены, я сказал, что счет прибыл (который не включает физических рук обмена денег), и случайно обновил банковское сальдо, что-то, что она сразу рассматривала как потенциальное мошенничество (она раньше делала судебный учет, все - потенциальное мошенничество ей, включая большую часть моего:-отраслей доли).
Вы могли столь же легко сказать, что часть кода означала промывать пол с огромной шваброй, решенной, чтобы сделать это с Вашей зубной щеткой.
С программированием OO, манипуляторами и управляет, неразрывно переплетены. Вы не применяете процесс промывки пола к полу, вместо этого Вы управляете, чтобы пол промыл себя. Это знает, как сделать это, потому что код является частью объекта, не чем-то внешним к ней.
В бухгалтерском случае выше, я думаю, что мы закончили тем, что имели план счетов как объект, и мы сказали ему применять счет к себе. Так как это поняло процесс, это знало, каким учетным записям позволили быть обновленными (учетная запись ответственности кредиторов и счет расходов, если я помню правильно).
Так или иначе, это не важно, и я просто блуждаю теперь. То, что я говорю, должно выразить его в терминах, которые поймет Ваша целевая аудитория. Я предполагаю, что это - секрет самых обучающих.
Как насчет "каждого прессования создается с помощью формы", или "каждая модель создается с помощью шаблона", и таким образом, "каждый объект создается с помощью класса"?
Примечание, что это работает на ориентированное на класс ООП (который является тем, что Вы хотите), но не для ориентированного на прототип ООП.
Что касается объяснения ООП программисту, я добавил бы иллюстрирование в качестве примера:
Большую часть времени, экземпляр описывает состояние, и класс описывает поведение.
экземпляр делегирует свое поведение к его классу, и класс в свою очередь может делегировать свое поведение к его суперклассам (или mixins или черты)
, Если класс A наследовался классу B, экземпляр A может использоваться где угодно, экземпляр класса B может использоваться.
сообщение А (или родовая функция или виртуальная функция) похоже на вопрос. Большую часть времени несколько классов могут ответить на этот вопрос.
А соответствующий метод является возможным ответом на вопрос, который находится в классе.
При отправке сообщения в экземпляр, экземпляр ищет соответствующий метод в своем классе. Если найдено, это называет его (с экземпляром, связанным с 'сам' или 'это'. Иначе это ищет соответствующий метод в своем mixins, чертах или суперклассах, и называет его.
Так как проблема должна объяснить новому программисту а не родительскому элементу или жене, я пошел бы право прямо на точку. OO является приблизительно тремя основными понятиями:
кроме того, в зависимости от того, насколько новый программист делал процедурный язык, я должен был бы помочь ему забыть это, функции или процедуры больше не являются центральными.
В то время как Вы объясняете OO с животными, не забывайте иллюстрировать, "-" отношения с Жало вооруженные ракетами кенгуру ;-)
рассеянные кенгуру, как предсказано, и американцы кивнули благодарно... и затем получше вгляделся, поскольку кенгуру вновь появились из-за выступа и запустили заграждение ракет жала в несчастном вертолете. (По-видимому, программисты забыли удалять "ту" часть кодирования пехоты).
урок? Объекты определяются с определенными атрибутами, и любой новый объект, определенный с точки зрения старого, наследовал все атрибуты. Смущенные программисты учились быть осторожными при многократном использовании объектно-ориентированного кода и янки, оставленных с предельным уважением к австралийской дикой природе.
Я второй подход 'Животных'!
Эта небольшая статья о JavaRanch, "То, как моя Собака изучила Полиморфизм", помогло мне много (это в значительной степени независимо от языка):
Я объясняю, что процедурная программа создается вокруг "глаголов" системы, вещи, которые Вы хотите, чтобы система сделала, тогда как объектно-ориентированное программирование является сборкой о "существительных", вещах в системе, и что они способны к, и что для многих людей благодаря этому более простое отобразилось от проблемной области до программного обеспечения.
Для примера, я использую автомобили - "Honda Accord" является классом, тогда как механизм, находящийся на парковке, является объектом, экземпляром Honda Accord. Honda Accord является седаном, который является автомобилем, который является автомобилем, который является моторизованным механизмом, который является режимом транспортировки и т.д. Я ничего не могу сделать с автомобилем, пока у меня нет физического автомобиля для работы с - это не помогает мне, что идея Honda Accord существует.
Это также помогает для обсуждения интерфейсов и полиморфизма - газовые средства педали ускоряют, независимо что автомобиль делает негласно, чтобы заставить это произойти. Существуют "частные" части автомобиля, к которому у меня как пользователь нет доступа - я не могу непосредственно применить отдельный тормоз.
Объектно-ориентированное программирование является одним методом повышения уровня абстракции, посредством которой программист связывается с компьютером: от уровня зеркального отражения отдельных битов на и прочь, от уровня перфорации дыр в бумажных картах, от уровня чрезвычайно сложных последовательностей кодов исходной команды, от уровня менее сложных определений допускающих повторное использование шаблонов для блоков данных и допускающих повторное использование блоков кода (структуры и процедуры), к уровню записи понятий в уме программиста в код, так, чтобы то, что продолжается в компьютере, прибыло для сходства для программиста, что продолжается вне компьютера в мире физических объектов, нематериальных активов, и причинно-следственный.
Объект является черным квадратом, который Вы не видите через. Открытые методы являются кнопками на них. Защищенные методы являются кнопками, скрытыми в нижней части, закрытые методы являются dip-переключателями внутри.
Позволяют нам рассматривать шайбу как объект. Мы не знаем, как это работает. Мы не заботимся, приводится ли это в действие природным газом, дизелем, электричеством или плутонием. Однако механизм и внутренняя структура будут варьироваться значительно в зависимости от источника энергии как двигатель внутреннего сгорания, необходим для некоторых. Мы не заботимся как долго, как будто мы нажимаем кнопку "Wash", она стирает нашу одежду.
Позволяют нам повернуть шайбу, не Объектно-ориентированную. Выставьте все кнопки путем расположения их на вершине. Клиенты могут теперь турбо заряд механизм путем тонкой настройки некоторых dip-переключателей. Сделайте шасси прозрачным. Теперь, Вы видите, что Ваша энергосберегающая стиральная машина на самом деле приводится в действие гибридом. Существуют некоторые обезьяны в нем. Вы освобождаете их в дикую местность, и машина съедает Ваш счет за коммунальные услуги как неэкономичный автомобиль.
Я предполагаю, что цель знает, как использовать графические интерфейсы пользователя. Я нашел, что лучший способ состоит в том, чтобы описать ООП с материалом, для которого они действительно используются. Скажите
, Окно является классом. Это имеет методы как [1 118]
окна, Окно имеет атрибуты. Это данные связано с ним. Это , инкапсулировал в класс, вместе с функциями, которые воздействуют на них
существует много окон. Каждое конкретное окно является объектом класса Окно . Окно Parent, содержащее 10 окон, делает 11 Объектов окна.
А Кнопка Окно. Это имеет размеры, имеет родительское окно и имеет заголовок, маркировку кнопки. Это специальный вид из окна. Когда Вы просите объект окна, кто-то может дать Вам Кнопка . Кнопка может добавить функции и данные, которые специфичны для кнопки:
ООП является более высоким уровнем абстракции, программист не может действительно приехать для схватывания его, если у него нет хорошего понимания нормального (чтение: процедурный) способ запрограммировать, и он должен смочь записать некоторые программы, которые делают что-то полезное.
Для меня это взяло серию нескольких лекций одним из моего университета профессора, где он обсудил много теоретических аспектов программирования, он пытался убедить нас, что программирование об управлении данными, и что эти данные являются представлением "состояния (состояний)" программы и некоторым другим абстрактным материалом, который я забыл теперь! Но точка, трудно понять ООП без некоторого теоретического абстрактного обсуждения сначала, и это обсуждение не имело бы никакого смысла человеку, у которого не было опыта при написании некоторого реального кода.
После теоретического обсуждения, Вы даете пример умеренно сложной программы, записанной в процедурном стиле, и медленно преобразовываете его, шаг за шагом, в объектно-ориентированный стиль. После конкретного примера необходимо вернуться к теоретическому обсуждению и просто суммировать основные моменты, непосредственно связать теоретические конструкции с конкретным примером, например, можно говорить о том, как имя, возраст и зарплата сотрудника представляют его состояние.
Хотите верьте, хотите нет, спорт !
я имел успех в обучении и менторстве путем разговора о пути, который, например, игра для футбольной команды описан с точки зрения того, как различные положения (Центр, Квотербек, Runningback, и т.д.) взаимодействуют для выполнения конкретной цели. В одной версии положения соответствуют классам, и определенные люди (Tony Romo, Johnny Unitas, и т.д.) являются экземплярами класса - люди, которые показывают те же поведения, как определено положениями.
вторая версия этой метафоры состоит в том, чтобы объяснить, что положения могут быть интерфейсами (в смысле Java), а не классы. Интерфейс действительно представляет роль, выполненную любым объектом, который реализует методы интерфейса. И совершенно разумно для объекта (через его класс в Java) реализовать несколько интерфейсов, так же, как для талантливого человека возможно играть больше чем на одной позиции на спортивной команде.
Наконец, игра похожа на шаблон, в котором она описывает, как ряд ролей взаимодействует для выполнения некоторой определенной цели.