oop - экземпляром - экземпляр класса c#




Разница между объектом и экземпляром (12)

Я знаю, что этот вопрос asked before , но я все еще чувствую, что ответ слишком неоднозначен для меня (и, как следствие, некоторых / самых начинающих), чтобы понять.

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

Я думаю, что у меня есть дескриптор того, что такое класс ( вроде проектной схемы для экземпляра, создаваемого по своему сходству во время компиляции ). Но если это так, то какой объект? Я также знаю, что на языках, основанных на прототипах, это может еще больше угаснуть, но, возможно, именно поэтому в моем сознании должно быть четкое различие между объектом и экземпляром.

Помимо этого, я борюсь с понятиями «объект» и «экземпляр». Многие ресурсы, которые я прочитал (включая ответы в SO), говорят, что они во многом одинаковы и что разница в семантике. Другие люди говорят, что между ними существует реальная концептуальная разница.

Могут ли эксперты здесь, в SO помочь новичкам, иметь этот «ага» момент для продвижения вперед в мире ООП?

Еще раз спасибо.

Примечание: это не домашнее задание, я не хожу в школу - однако, я думаю, это поможет людям, которые ищут домашнюю работу.


Что такое объект?

Объект является экземпляром класса. Объект лучше всего понять, найдя вокруг вас примеры реального мира. Вы стол, ваш ноутбук, ваш автомобиль - все это хорошие реальные образцы мира.

Объект реального мира имеет две характеристики, все они имеют состояние и поведение. Люди также являются хорошим примером объекта, у нас есть состояние / атрибуты - имя, высота, вес и поведение - ходить, бегать, разговаривать, спать, код: P.

Что такое класс?

Класс - это проект или шаблон, который описывает детали объекта. Эти данные

атрибуты имени / состояния / методы

class Car 
{
    int speed = 0;
    int gear = 1;

    void changeGear(int newGear)
    {
        gear = newGear;
    }

    void speedUp(int increment) 
    {
        speed = speed + increment;
    }

    void applyBrakes(int decrement) 
    {
        speed = speed - decrement;
    }
}

Рассмотрим приведенный выше пример, speed и gear полей будут представлять состояние объекта, а методы changeGear , speedUp и applyBrakes определяют поведение объекта Car с внешним миром.

Рекомендации:


«Класс описывает набор объектов, называемых его экземплярами». - Исследовательская группа по изучению Xerox, «Система Smalltalk-80», журнал Byte Volume 06, номер 08, p39, 1981.


Давайте сравним яблоки с яблоками. Мы все знаем, что такое яблоко. На что это похоже. На что он похож. Это класс. Это определение вещи. Это то, что мы знаем о чем-то.

Теперь найдите яблоко. Это пример. Мы можем это видеть. Мы можем попробовать его. Мы можем делать с этим все. Это то, что у нас есть.

Класс = Что мы знаем о чем-то. Определение.

Object / Instance = Что-то, что соответствует этому определению, которое мы имеем и можем делать.


Для меня существует небольшая разница между объектом и экземпляром

Подобно :

class1 obj;

здесь obj - это экземпляр класса 1, который занимает стек памяти

class1 obj = новый класс1 ();

в этом случае obj является объектом класса 1 и занимает кучу памяти


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

Объект - это нечто, что может представлять что-то в реальном мире. Когда вы хотите, чтобы объект фактически представлял что-то в реальном мире, объект должен быть создан. Активация означает, что вы должны определить характеристики (атрибуты) этого конкретного объекта, обычно через конструктор.

После того, как вы определили эти характеристики, у вас теперь есть экземпляр объекта.

Надеюсь, это прояснит ситуацию.


Мне всегда нравилась идея, равная определению класса, как определение типа абстрактных данных . То есть, когда вы определили класс, который вы определяете, новый тип «что-то», его представление типа данных в терминах примитивов и других «вещей» и его поведение в терминах функций и / или методов. (Извините за общность и формализм)

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

Иногда термины object и экземпляры взаимозаменяемы. Некоторые пуристы ООП будут утверждать, что все является объектом, я не буду жаловаться, но в реальном мире ООП разработчики используют две концепции:

  1. Класс: образец абстрактного типа данных, из которого вы можете получить другой ADT и создать объекты.
  2. Объекты: также называемые экземплярами, представляют собой конкретные примеры структур данных и функций, представленных данным абстрактным типом данных.

Объект: когда мы создаем объект, некоторая память занята этим объектом Ex: Test t = new Test (); // здесь t является объектом класса Test

Экземпляр: когда мы объявляем отдельную память экземпляра, этот объект не занят. Ex: Test t; // здесь t - это экземпляр класса Test


Объектно-ориентированное программирование - это метафора системы, которая помогает вам организовать знания, которые ваша программа должна обрабатывать, таким образом, чтобы облегчить вам разработку вашей программы. Когда вы выбираете программу с использованием ООП, вы выбираете свои ООП-Гуглы, и вы решаете, что вы увидите проблему реального мира, так как многие объекты взаимодействуют между собой, отправляя сообщения. Вместо того, чтобы видеть, как Гай водит Автомобиль, вы видите, как Гай отправляет сообщение в машину, указывающее, что он хочет, чтобы автомобиль сделал. Автомобиль - большой объект, и он ответит на это сообщение, отправив сообщение на его движок или его колесо, чтобы иметь возможность правильно реагировать на то, что водитель сказал ему сделать в сообщении, и т. Д.

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

  • Все эти парни ведут себя одинаково, поэтому я создам класс под названием «Драйвер», в котором будут указаны все, кто все Драйверы в мире ведут себя, потому что все они ведут себя одинаково. (И вы используете ООП класса)
  • Или ты мог сказать Эй! Второй драйвер ведет себя так же, как и первый драйвер, за исключением того, что ему нравится идти немного быстрее. И третий драйвер ведет себя так же, как и первый драйвер, за исключением того, что ему нравится зигзагообразно, когда он водит. (И вы используете прототип OOP).

Затем вы начинаете вводить в компьютер информацию о том, как ведут себя все драйверы (или как работает первый драйвер, и как второй и третий отличаются от этого), и через некоторое время у вас есть ваша программа, и вы используете код для создайте три драйвера, которые являются моделью, которую вы используете внутри этого ПК, чтобы возместить драйверы, которые вы видели в реальном мире. Эти 3 драйвера, которые вы создали на ПК, являются экземплярами либо прототипа (на самом деле первым из них является прототип, первым из которых может быть сам прототип в зависимости от того, как вы моделируете вещи) или созданный вами класс. Разница между экземпляром и объектом заключается в том, что объект является метафорой, которую вы используете в реальном мире. Вы решили увидеть парня и машину в качестве объектов (было бы неправильно сказать, что вы видите их как экземпляры), сотрудничающие между собой. И затем вы используете его как вдохновение для создания своего кода. Экземпляр существует только в вашей программе после создания прототипа или класса. «Объекты» существуют вне ПК, потому что это сопоставление, которое вы используете для объединения реального мира с программой. Он объединяет Guy с экземпляром драйвера, созданного на ПК. Таким образом, объект и экземпляр чрезвычайно связаны друг с другом, но они не совсем одинаковы (экземпляр - это «нога» объекта в программе, а другая «нога» находится в реальном мире).


Просто скажите, что объект является единственным объявлением, которое не выделяет память. и экземпляр - это объект класса, который выделяет память.


Расширение одного из ранее приведенных примеров в этом потоке ...

Рассмотрим сценарий. Требование состоит в том, чтобы в жилом доме было построено 5 домов. Все 5 домов имеют общую архитектуру строительства. Архитектура строительства - это класс . Дом - это объект . Каждый дом с людьми, остающимися в нем, является примером .


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


Объекты - это вещи в памяти, а экземпляры - это вещи, которые ссылаются на них. В приведенном выше рисунке:

  • std (экземпляр) -> Студенческий объект (справа)
  • std1 (экземпляр) -> Студенческий объект (слева)
  • std2 (экземпляр) -> Студенческий объект (слева)
  • std3 (instance) -> no object (null)




oop