21 Mar, 2009 · 4 minutes read
Two concepts that go together in the object oriented approach are Encapsulation & Abstraction. Abstraction is the representation of only the essential features of an object, while Encapsulation is the hiding of the non-essential features.
Think of a person driving a car. He does not need to know the internal working of the engine or the way gear changes work, to be able to drive the car (Encapsulation). Instead, he needs to know things such as how much turning the steering wheel needs, etc (Abstraction).
Consider the example from the programmer’s perspective who wants to allow the user to add items to a list. The user only needs to click a button to add an item (Abstraction). The mechanism of how the item is added to the list is not essential for him (Encapsulation).
Below is a graphical representation of Encapsulation for the car class.
Consider the countless advertisements being bombarded to viewers. The viewer does not listen to each one of them, rather only those he?s curious about. We use access specifiers to restrict the scope (visibility) of the class members.
Both these classes are equivalent.
class MyClass
{
}
internal class MyClass
{
}
Note: The members are always accessible to its own member functions, irrespective of the access specifier.
Lets see an example:-
class House
{
// Data Members
public string DrawingRoom;
private string Kitchen;
// Member Functions
private bool EnterDrawingRoom()
{
DrawingRoom = "The Drawing Room";
}
public bool EnterKitchen()
{
Kitchen = "The Kitchen"; /* Even though Kitchen is declared Private, EnterKitchen function
can modify it because the member function itself has access to all other members. */
}
}
class MainClass
{
public static void Main()
{
House TheBlackHouse = new House();
TheBlackHouse.DrawingRoom = "Main Drawing Room"; /* OK - Public Data Member is accessible
from outside the class */
TheBlackHouse.Kitchen = "Main Kitchen"; /* Error - Private Data Member is not accessible
from outside the class. */
TheBlackHouse.EnterDrawingRoom(); /* Error - Private Member Function is not accessible
// from outside the class. */
TheBlackHouse.EnterKitchen(); /* OK - Public Data Member is accessible from outside
the class. */
}
}
Lets study the code. Inside the main function we declare an object TheBlackHouseof the Houseclass. Thereafter, we set the value of the data member DrawingRoomfor TheBlackHouseto “Main Drawing Room”. Since, DrawingRoomis declared as public, the above step works without any error. On the next line, TheBlackHouse.Kitchen = “Main Kitchen”;we are trying to assign the value “Main Kitchen” to the Kitchenvariable of TheBlackHouseobject. However, Kitchenis declared as private. Hence, this step generates an error.
In the next line, we are trying to call the privatemethod EnterDrawingRoomfor the object. This generates an error as well. Finally, we are calling the EnterKitchenfunction which is declared as public. Notice that inside the EnterKitchenfunction, we are assigning the value “The Kitchen”to the privatevariable Kitchen. This does not generate an error because the EnterKitchenmethod belongs to the same class and it has access to all the members inside the class, irrespective of the access specifier.
Programming is all about concepts, different from coding where we basically translate the logic to language specific codes. When given a problem statement, there might be a number of ways to solve it. The logic devised to solve it will depend of the programmer. What we must learn to implement is the most efficient approach; efficient in terms of time, memory & cost. Object oriented methodologies such as these are what allow us to maintain efficiency.
By using encapsulation & abstraction, we reduce complexity by ignoring unimportant details and we maintain effectiveness by representing important ones.