Możliwym scenariuszem, w którym miałoby to miejsce, jest sytuacja, w której biblioteka bazy danych, napisana w czasach, gdy miejsce na dysku twardym było bardzo ograniczone, wykorzystywała jeden bajt do przechowywania pola „roku” daty (np. 11-NOV-1973 musiałby 73za rok). Ale kiedy nadszedł rok 2000, nie byłoby to już wystarczające, a rok musiał być zapisany jako krótka (16-bitowa) liczba całkowita. Odpowiednim (znacznie uproszczonym) nagłówkiem dla tej biblioteki może być:
// dbEntry.h
typedef struct _dbEntry dbEntry;
dbEntry* CreateDBE(int day, int month, int year, int otherData);
void DeleteDBE(dbEntry* entry);
int GetYear(dbEntry* entry);
Program „kliencki” to:
#include <stdio.h>
#include "dbEntry.h"
int main()
{
int dataBlob = 42;
dbEntry* test = CreateDBE(17, 11, 2019, dataBlob);
//...
int year = GetYear(test);
printf("Year = %d\n", year);
//...
DeleteDBE(test);
return 0;
}
„Oryginalna” implementacja:
#include <stdlib.h>
#include "dbEntry.h"
struct _dbEntry {
unsigned char d;
unsigned char m;
unsigned char y; // Fails at Y2K!
int dummyData;
};
dbEntry* CreateDBE(int day, int month, int year, int otherData)
{
dbEntry* local = malloc(sizeof(dbEntry));
local->d = (unsigned char)(day);
local->m = (unsigned char)(month);
local->y = (unsigned char)(year % 100);
local->dummyData = otherData;
return local;
}
void DeleteDBE(dbEntry* entry)
{
free(entry);
}
int GetYear(dbEntry* entry)
{
return (int)(entry->y);
}
Następnie, przy podejściu Y2K, ten plik implementacji zostałby zmieniony w następujący sposób (wszystko inne pozostało nietknięte):
struct _dbEntry {
unsigned char d;
unsigned char m;
unsigned short y; // Can now differentiate 1969 from 2069
int dummyData;
};
dbEntry* CreateDBE(int day, int month, int year, int otherData)
{
dbEntry* local = malloc(sizeof(dbEntry));
local->d = (unsigned char)(day);
local->m = (unsigned char)(month);
local->y = (unsigned short)(year);
local->dummyData = otherData;
return local;
}
Gdy klient musi zostać zaktualizowany w celu korzystania z nowej (bezpiecznej dla Y2K) wersji, zmiany kodu nie będą wymagane. W rzeczywistości, może nawet nie trzeba ponownie skompilować: po prostu re-łączenie do zaktualizowanej biblioteki obiektów (jeśli to, co to jest) może być wystarczająca.
structjest to czarna skrzynka z nieznanymi elementami wewnętrznymi. Jeśli klient nie zna elementów wewnętrznych, nigdy nie może uzyskać do nich bezpośredniego dostępu i można je dowolnie zmieniać. Jest to podobne do enkapsulacji w OOP. Elementy wewnętrzne są prywatne, a obiekt zmienia się tylko przy użyciu metod publicznych.