Re[23]: Суть полимор
От: Павел Кузнецов  
Дата: 07.11.04 04:32
Оценка: 15 (2)
VladD2:

> ПК> Интересно... А в чем, по-твоему, большее совершенство, скажем, C++ по сравнению c С с точки зрения инкапсуляции?


> Она в нем есть.


Средства для обеспечения инкапсуляции есть и в C. При этом получающаяся инкапсуляция ничуть не "меньше", чем в C++.

> ПК> Можно примерчик?


> С++:

>
> struct A
> {
> private:
>     int _val;
>
> public:
>     int getVal() { return _val; }
>
>     void setVal(int val)
>     {
>         if (val < 0)
>             throw "требования инкапсуляции не допускают установку "
>                 "отрицальтного значения свойству Val.";
>        _val = val;
>     }
> };
>
> void main()
> {
>     A a;
>     a.setVal(123);  // OK
>     a.setVal(-123); // Облом в рантайме.
>     a._val = -123;  // Облом во время компиляции.
> }


Ты привел неэквивалентный с точки зрения инкапсуляции пример на C. Но это не означает, что нельзя написать эквивалентный в этом отношении пример на C. Вот он:

Заголовочный файл:
typedef int ErrorCode;

#define A_OK                 ((ErrorCode)0)

// Требования инкапсуляции не допускают установку
// отрицальтного значения свойству Val.
//
#define A_ERROR_INVALID_VAL  ((ErrorCode)-1)

typedef struct Atag A;

A*        create_A(void);
void      delete_A(A*);
int       A_getVal(A*);
ErrorCode A_setVal(A*, int);


Файл с реализацией:
. . .

struct Atag
{
   int _val;
};

A* create_A(void)
{
   A* a = (A*)malloc(sizeof(A));
   return a;
}

void delete_A(A* a)
{
   free(a);
}

int A_getVal(A* a)
{
   return a->_val;
}

ErrorCode setVal(A* a, int val)
{
   if (val < 0)
     return A_ERROR_INVALID_VAL;

   a->_val = val;
   return A_OK;
}


Использование:
int main()
{
   A*        a;
   ErrorCode err_code;

   a = create_A();
   if (!a)
     return -1;

   err_code = 0;

   . . .

   if (err_code != A_OK)
     err_code = A_setVal(a, 123);  // OK

   if (err_code != A_OK)
     err_code = A_setVal(a, -123); // Облом в рантайме.

   if (err_code != A_OK)
     a->_val = -123;  // Облом во время компиляции.

   delete_A(a);

   return err_code == A_OK ? 0 : -1;
}


> Не думаю, что этот пример был действительно нужен.


Отчего же, он вполне хорошо проиллюстрировал твою позицию, здорово сэкономив нам время на ненужной риторике. Как видишь, C вполне позволяет писать код, эквивалентный в отношении инкапсуляции коду на C++. Скажем, та же Win API в этом отношении вполне в порядке.
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.