atavin-ta » 12 окт 2009, 06:20
по адресу
http://www.programmersforum.ru/showthread.php?t=65466
говорилось, что цилидры и поршни инкапулированы в автомобиль и водителю не надо знать, как они работают. Согласен. Но ему не надо знать, как они работают именно потому, что на заводе чертёж автомобиля уже с поршнями и цилиндрами многкратно (а значит, повторно) исспользован при изготовлении каждого автомобиля. Если же каждый водитель будет для себся конструировать с нуля уникальный автомобиль, то ему придётся знать, как этот автомобиль вустроен и как работают цилиндры и поршни. Таким образом, сокрытие деталей реализации (причём, не только данных, но и кода) неотделимо от повторного использования. Ты перевёл слово Incapsulation с английского - приму на веру. Но даже при таком значении слова возможность повторного использования кода -
неотемлемое свойство любой инкапсуляции. Тогда ошибки нет, с учётом того, что я не утверждал, что инкапсуляция
предназначена для повторного исспользования кода, или что инкапсуляция -
это любое повторное исспользование кода (например, include предназначен для повторного исспользования кода), а только сказал, что инкапсуляции
позволяет повторно исспользовать код. Кстати, позволь указать на то, что слово Incapsulation многознано. Одно значение - сокрытие (спрятать, чтоб никто не знал), другое - изоляция (закрыть доступ). Но если изоляция, то и упаковка и герметизация все остальные близкие значения. А для чего упаковывать? Чтобы сделать невидимым? Как вариант принимается. А может быть, для того, чтобы это был комплект? Чтобы можно было обратиться целиком к классу при описании переменной (объект - это тоже переменная, а класс объекта - тип этой переменной) и, один раз повторно введя имя класса, повторно исспользовать всё, что в нём декларировано или реализовано? Такой вариант исспользования упаковки тоже нельзя исключать. Кроме того, при инкапсуляции скрываются не только данные. Скрыть данные без сокрытия кода можно только в том случае, если сделать невидимым весь объект. Но тогда зачем он вообще нужен. Истинный же смысл инкапсуляции тогда - сокрытие в первую очередь кода.
что такое int Get ();?
Код: Выделить всё
class A
{
protected:
int data;
public:
int Get ()
{
return Data;
}
};
?
Код: Выделить всё
class A
{
protected:
float data;
public:
int Get ()
{
return (int) Data;
}
};
?
Код: Выделить всё
class A
{
protected:
bool f();
public:
int Get ()
{
int i;
for (i=0; f(); ++i);
return i;
}
};
?
Пользователю это не известно. Если же он будет знать, что int Get (); - это
Код: Выделить всё
class A
{
protected:
int data;
public:
int Get ()
{
return Data;
}
};
, то он будет занть, что существует данное член int Data; и как именно получают его значение. То есть сокрытие в данном случае места не имеет. Нет даже защиты доступа, так как пользователь может его получить через asm. Сокрытие же кода функции int Get(); обеспечивает сокрытие и данных. Именно
сокрытие этого кода и есть инкапсуляция, а вовсе не то, что ты прячешь декларацию данных. Так вот,
в любом классе, объекты которого разрешено создавать, обязательно есть как минимум две функции со скрытым кодом: конструктор и деструктор (или конструктор и финализатор). Даже если они не созданы разработчиком класса, их по дефолту создаст компилятор. Но тогда,
вообще любой объект любого класса инкапсулирует эти две функции. Как именно создаётся и как уничтожается объект? Ни один пользователь этого не знает. Если же ты выложишь на виду исходник с реализацией классса, то получишь только коплект в прозрачной уапаковке. Это тоже Incupsulation (в обыденном значении английского слова), но без сокрытия (в любом значении русского слова).
по адресу
[url]http://www.programmersforum.ru/showthread.php?t=65466[/url]
говорилось, что цилидры и поршни инкапулированы в автомобиль и водителю не надо знать, как они работают. Согласен. Но ему не надо знать, как они работают именно потому, что на заводе чертёж автомобиля уже с поршнями и цилиндрами многкратно (а значит, повторно) исспользован при изготовлении каждого автомобиля. Если же каждый водитель будет для себся конструировать с нуля уникальный автомобиль, то ему придётся знать, как этот автомобиль вустроен и как работают цилиндры и поршни. Таким образом, сокрытие деталей реализации (причём, не только данных, но и кода) неотделимо от повторного использования. Ты перевёл слово Incapsulation с английского - приму на веру. Но даже при таком значении слова возможность повторного использования кода - [b]неотемлемое свойство [/b]любой инкапсуляции. Тогда ошибки нет, с учётом того, что я не утверждал, что инкапсуляция [b]предназначена[/b] для повторного исспользования кода, или что инкапсуляция - [b]это любое повторное исспользование кода[/b] (например, include предназначен для повторного исспользования кода), а только сказал, что инкапсуляции [b]позволяет повторно исспользовать код[/b]. Кстати, позволь указать на то, что слово Incapsulation многознано. Одно значение - сокрытие (спрятать, чтоб никто не знал), другое - изоляция (закрыть доступ). Но если изоляция, то и упаковка и герметизация все остальные близкие значения. А для чего упаковывать? Чтобы сделать невидимым? Как вариант принимается. А может быть, для того, чтобы это был комплект? Чтобы можно было обратиться целиком к классу при описании переменной (объект - это тоже переменная, а класс объекта - тип этой переменной) и, один раз повторно введя имя класса, повторно исспользовать всё, что в нём декларировано или реализовано? Такой вариант исспользования упаковки тоже нельзя исключать. Кроме того, при инкапсуляции скрываются не только данные. Скрыть данные без сокрытия кода можно только в том случае, если сделать невидимым весь объект. Но тогда зачем он вообще нужен. Истинный же смысл инкапсуляции тогда - сокрытие в первую очередь кода.
[code]
class A
{
public:
int Get ();
};
[/code]
что такое int Get ();?
[code]
class A
{
protected:
int data;
public:
int Get ()
{
return Data;
}
};
[/code]
?
[code]
class A
{
protected:
float data;
public:
int Get ()
{
return (int) Data;
}
};
[/code]
?
[code]
class A
{
protected:
bool f();
public:
int Get ()
{
int i;
for (i=0; f(); ++i);
return i;
}
};
[/code]
?
Пользователю это не известно. Если же он будет знать, что int Get (); - это
[code]
class A
{
protected:
int data;
public:
int Get ()
{
return Data;
}
};
[/code]
, то он будет занть, что существует данное член int Data; и как именно получают его значение. То есть сокрытие в данном случае места не имеет. Нет даже защиты доступа, так как пользователь может его получить через asm. Сокрытие же кода функции int Get(); обеспечивает сокрытие и данных. Именно [b]сокрытие этого кода [/b]и есть инкапсуляция, а вовсе не то, что ты прячешь декларацию данных. Так вот, [b]в любом классе, объекты которого разрешено создавать, обязательно есть как минимум две функции со скрытым кодом[/b]: конструктор и деструктор (или конструктор и финализатор). Даже если они не созданы разработчиком класса, их по дефолту создаст компилятор. Но тогда, [b]вообще любой объект любого класса[/b] инкапсулирует эти две функции. Как именно создаётся и как уничтожается объект? Ни один пользователь этого не знает. Если же ты выложишь на виду исходник с реализацией классса, то получишь только коплект в прозрачной уапаковке. Это тоже Incupsulation (в обыденном значении английского слова), но без сокрытия (в любом значении русского слова).