C# OOPS

OOP Features

Object Oriented Programming (OOP) is a programming model where programs are organized around objects and data rather than action and logic.

OOP allows decomposition of a problem into a number of entities called objects and then builds data and functions around these objects.

  1. The software is divided into a number of small units called objects. The data and functions are built around these objects.
  2. The data of the objects can be accessed only by the functions associated with that object.
  3. The functions of one object can access the functions of another object.

OOP has the following important features.

 Class

A class is the core of any modern Object Oriented Programming language such as C#.

In OOP languages it is mandatory to create a class for representing data.

A class is a blueprint of an object that contains variables for storing data and functions to perform operations on the data.

A class will not occupy any memory space and hence it is only a logical representation of data.

To create a class, you simply use the keyword “class” followed by the class name:

class Employee
{

}

Object

Objects are the basic run-time entities of an object oriented system. They may represent a person, a place or any item that the program must handle.

“An object is a software bundle of related variable and methods.”

“An object is an instance of a class”

A class will not occupy any memory space. Hence to work with the data represented by the class you must create a variable for the class, that is called an object.

When an object is created using the new operator, memory is allocated for the class in the heap, the object is called an instance and its starting address will be stored in the object in stack memory.

When an object is created without the new operator, memory will not be allocated in the heap, in other words an instance will not be created and the object in the stack contains the value null.

When an object contains null, then it is not possible to access the members of the class using that object.

class Employee
{

}

Syntax to create an object of class Employee:

Employee objEmp = new Employee();

All the programming languages supporting Object Oriented Programming will be supporting these three main concepts:

  1. Encapsulation
  2. Inheritance
  3. Polymorphism

Abstraction

Abstraction is “To represent the essential feature without representing the background details.”

Abstraction lets you focus on what the object does instead of how it does it.

Abstraction provides you a generalized view of your classes or objects by providing relevant information.

Abstraction is the process of hiding the working style of an object, and showing the information of an object in an understandable manner.

Real-world Example of Abstraction

Suppose you have an object Mobile Phone.

Suppose you have 3 mobile phones as in the following:

Nokia 1400 (Features: Calling, SMS)
Nokia 2700 (Features: Calling, SMS, FM Radio, MP3, Camera)
Black Berry (Features:Calling, SMS, FM Radio, MP3, Camera, Video Recording, Reading E-mails)

Abstract information (necessary and common information) for the object “Mobile Phone” is that it makes a call to any number and can send SMS.

So that, for a mobile phone object you will have the abstract class as in the following:

   abstract class MobilePhone

    {

        public void Calling();

        public void SendSMS();

    }

    public class Nokia1400 : MobilePhone

    {

    }

    public class Nokia2700 : MobilePhone

    {

        public void FMRadio();

        public void MP3();

        public void Camera();

    }

    public class BlackBerry : MobilePhone

    {

        public void FMRadio();

        public void MP3();

        public void Camera();

        public void Recording();

        public void ReadAndSendEmails();

    }

Abstraction means putting all the variables and methods in a class that are necessary.

For example: Abstract class and abstract method.

Abstraction is a common thing.

Example

If somebody in your collage tells you to fill in an application form, you will provide your details, like name, address, date of birth, which semester, percentage you have etcetera.

If some doctor gives you an application to fill in the details, you will provide the details, like name, address, date of birth, blood group, height and weight.

See in the preceding example what is in common?

Age, name and address, so you can create a class that consists of the common data. That is called an abstract class.

That class is not complete and it can be inherited by other classes.

Encapsulation

Wrapping up a data member and a method together into a single unit (in other words class) is called Encapsulation.

Encapsulation is like enclosing in a capsule. That is enclosing the related operations and data related to an object into that object.

Encapsulation is like your bag in which you can keep your pen, book etcetera. It means this is the property of encapsulating members and functions.

class Bag
{
book;
pen;
ReadBook();
}

Encapsulation means hiding the internal details of an object, in other words how an object does something.

Encapsulation prevents clients from seeing its inside view, where the behaviour of the abstraction is implemented.

Encapsulation is a technique used to protect the information in an object from another object.

Hide the data for security such as making the variables private, and expose the property to access the private data that will be public.

So, when you access the property you can validate the data and set it.

Example 1

    class Demo

    {

        private int _mark;

        public int Mark

        {

            get { return _mark; }

            set { if (_mark > 0) _mark = value; else _mark = 0; }

        }

    }

Real-world Example of Encapsulation

Let’s use as an example Mobile Phones and Mobile Phone Manufacturers.
Suppose you are a Mobile Phone Manufacturer and you have designed and developed a Mobile Phone design (a class). Now by using machinery you are manufacturing Mobile Phones (objects) for selling, when you sell your Mobile Phone the user only learns how to use the Mobile Phone but not how the Mobile Phone works.

This means that you are creating the class with functions and by with objects (capsules) of which you are making available the functionality of your class by that object and without the interference in the original class.

Example 2

TV operation 

It is encapsulated with a cover and we can operate it with a remote and there is no need to open the TV to change the channel.
Here everything is private except the remote, so that anyone can access the remote to operate and change the things in the TV.

Inheritance

When a class includes a property of another class it is known as inheritance.

Inheritance is a process of object reusability.

For example, a child includes  the properties of its parents.

    public class ParentClass

    {

        public ParentClass()

        {

            Console.WriteLine(“Parent Constructor.”);

        }

        public void print()

        {

            Console.WriteLine(“I’m a Parent Class.”);

        }

    }

    public class ChildClass : ParentClass

    {

        public ChildClass()

        {

            Console.WriteLine(“Child Constructor.”);

        }

        public static void Main()

        {

            ChildClass child = new ChildClass();

            child.print();

        }

    }

Output

    Parent Constructor.
Child Constructor.
I’m a Parent Class.

Polymorphism

Polymorphism means one name, many forms.

One function behaves in different forms.

In other words, “Many forms of a single object is called Polymorphism.”

Real-world Example of Polymorphism

Example 1

A teacher behaves students.

A teacher behaves his/her seniors.

Here teacher is an object but the attitude is different in different situations.

Example 2

A person behaves the son in a house at the same time that the person behaves an employee in an office.

Example 3

Your mobile phone, one name but many forms:

  • As phone
  • As camera
  • As mp3 player
  • As radio

To read about Polmorphism in detail click the following link:

Polymorphism in .Net

The Differences between Abstraction and Encapsulation

Abstraction Encapsulation
1.  Abstraction solves the problem at the design level. 1. Encapsulation solves the problem in the implementation level.
2. Abstraction hides unwanted data and provides relevant data. 2. Encapsulation means hiding the code and data into a single unit to protect the data from the outside world.
3. Abstraction lets you focus on what the object does instead of how it does it 3. Encapsulation means hiding the internal details or mechanics of how an object does something.
4. Abstraction: Outer layout, used in terms of design.
For example:
An external of a Mobile Phone, like it has a display screen and keypad buttons to dial a number.
4. Encapsulation- Inner layout, used in terms of implementation.

For example: the internal details of a Mobile Phone, how the keypad button and display screen are connected with each other using circuits.

 The easier way to understand abstraction and encapsulation is as follows.

Real-world Example

Use an example of a Mobile Phone

You have a Mobile Phone, you can dial a number using keypad buttons. You don’t even know how these are working internally. This is called Abstraction. You only have the information that is necessary to dial a number. But not internal working of the mobile.

But how does the Mobile Phone work internally? How are the keypad buttons connected with internal circuit? That is called Encapsulation.

Summary

“Encapsulation is accomplished using classes. Keeping data and methods that access that data into a single unit.”

“Abstraction is accomplished using an Interface. Just giving the abstract information about what it can do without specifying the details.”

“Information/Data hiding is accomplished using modifiers by keeping the instance variables private or protected.”

http://pramadha.com/

OOPS Concept

Class:

 It is a collection of objects.

Object:

It is a real time entity.

An object can be considered a “thing” that can perform a set of related activities. The set of activities that the object performs defines the object’s behavior. For example, the hand can grip something or aStudent (object) can give the name or address. In pure OOP terms an object is an instance of a class

 

The above template describe about object Student

Class is composed of three things name, attributes, and operations

public class student

{

}

student objstudent=new student ();

According to the above sample we can say that Student object, named objstudent, has created out of the student class.

In real world you will often find many individual objects all of the same kind. As an example, there may be thousands of other bicycles in existence, all of the same make and model. Each bicycle has built from the same blueprint. In object-oriented terms, we say that the bicycle is an instance of the class of objects known as bicycles. In the software world, though you may not have realized it, you have already used classes. For example, the Textbox control, you always used, is made out of the Textbox class, which defines its appearance and capabilities. Each time you drag a Textbox control, you are actually creating a new instance of the Textbox class.

Encapsulation:

Encapsulation is a process of binding the data members and member functions into a single unit.

Example for encapsulation is class. A class can contain data structures and methods.

Consider the following class

public class Aperture

{

public Aperture ()

{

}

protected double height;

protected double width;

protected double thickness;

public double get volume()

{

Double volume=height * width * thickness;

if (volume<0)

return 0;

return volume;

}

}


In this example we encapsulate some data such as height, width, thickness and method Get Volume. Other methods or objects can interact with this object through methods that have public access modifier

Abstraction:

Abstraction is a process of hiding the implementation details and displaying the essential features.

Example1: A Laptop consists of many things such as processor, motherboard, RAM, keyboard, LCD screen, wireless antenna, web camera, usb ports, battery, speakers etc. To use it, you don’t need to know how internally LCD screens, keyboard, web camera, battery, wireless antenna, speaker’s works.  You just need to know how to operate the laptop by switching it on. Think about if you would have to call to the engineer who knows all internal details of the laptop before operating it. This would have highly expensive as well as not easy to use everywhere by everyone.

So here the Laptop is an object that is designed to hide its complexity.

How to abstract: – By using Access Specifiers

.Net has five access Specifiers

Public — Accessible outside the class through object reference.

Private — Accessible inside the class only through member functions.

Protected — Just like private but Accessible in derived classes also through member 

functions.

Internal — Visible inside the assembly. Accessible through objects.

Protected Internal — Visible inside the assembly through objects and in derived classes outside the assembly through member functions.

Let’s try to understand by a practical example:-

public class Class1

    {

        int  i;                                         //No Access specifier means private

        public  int j;                                        // Public

        protected int k;                             //Protected data

        internal int m;                        // Internal means visible inside assembly

        protected internal int n;                   //inside assembly as well as to derived classes outside assembly

        static int x;                                 // This is also private

        public static int y;                       //Static means shared across objects

        [DllImport(“MyDll.dll”)]

        public static extern int MyFoo();       //extern means declared in this assembly defined in some other assembly

        public void myFoo2()

        {

            //Within a class if you create an object of same class then you can access all data members through object reference even private data too

            Class1 obj = new Class1();

            obj.i =10;   //Error can’t access private data through object.But here it is accessible.:)

            obj.j =10;

            obj.k=10;

            obj.m=10;

            obj.n=10;

       //     obj.s =10;  //Errror Static data can be accessed by class names only

            Class1.x = 10;

         //   obj.y = 10; //Errror Static data can be accessed by class names only

            Class1.y = 10;

        }

    }

Now lets try to copy the same code inside Main method and try to compile

[STAThread]

        static void Main()

        {

           //Access specifiers comes into picture only when you create object of class outside the class

            Class1 obj = new Class1();

       //     obj.i =10; //Error can’t access private data through object.

            obj.j =10;

      //      obj.k=10;     //Error can’t access protected data through object.

            obj.m=10;

            obj.n=10;

       //     obj.s =10;  //Errror Static data can be accessed by class names only

            Class1.x = 10;  //Error can’t access private data outside class

         //   obj.y = 10; //Errror Static data can be accessed by class names only

            Class1.y = 10;

        }

What if Main is inside another assembly

[STAThread]

        static void Main()

        {

           //Access specifiers comes into picture only when you create object of class outside the class

            Class1 obj = new Class1();

       //     obj.i =10; //Error can’t access private data through object.

            obj.j =10;

      //      obj.k=10;     //Error can’t access protected data through object.

     //     obj.m=10; // Error can’t access internal data outside assembly

    //      obj.n=10; // Error can’t access internal data outside assembly

       //     obj.s =10;  //Errror Static data can be accessed by class names only

            Class1.x = 10;  //Error can’t access private data outside class

         //   obj.y = 10; //Errror Static data can be accessed by class names only

            Class1.y = 10;

        }

In object-oriented software, complexity is managed by using abstraction.

Abstraction is a process that involves identifying the critical behavior of an object and eliminating irrelevant and complex details.

Inheritance:

Inheritance is a process of deriving the new class from already existing class

C# is a complete object oriented programming language. Inheritance is one of the primary concepts of object-oriented programming. It allows you to reuse existing code. Through effective use of inheritance, you can save lot of time in your programming and also reduce errors, which in turn will increase the quality of work and productivity. A simple example to understand inheritance in C#.

Using System;

Public class BaseClass

{

    Public BaseClass ()

    {

        Console.WriteLine (“Base Class Constructor executed”);

    }

                                 

    Public void Write ()

    {

        Console.WriteLine (“Write method in Base Class executed”);

    }

}

                                 

Public class ChildClass: BaseClass

{

                                 

    Public ChildClass ()

    {

        Console.WriteLine(“Child Class Constructor executed”);

    }

   

    Public static void Main ()

    {

        ChildClass CC = new ChildClass ();

        CC.Write ();

    }

}

In the Main () method in ChildClass we create an instance of childclass. Then we call the write () method. If you observe the ChildClass does not have a write() method in it. This write () method has been inherited from the parent BaseClass.

The output of the above program is

Output:

  Base Class Constructor executed
Child Class Constructor executed
Write method in Base Class executed

this output proves that when we create an instance of a child class, the base class constructor will automatically be called before the child class constructor. So in general Base classes are automatically instantiated before derived classes.

In C# the syntax for specifying BaseClass and ChildClass relationship is shown below. The base class is specified by adding a colon, “:”, after the derived class identifier and then specifying the base class name.

Syntax:  class ChildClassName: BaseClass
{
//Body
}

C# supports single class inheritance only. What this means is, your class can inherit from only one base class at a time. In the code snippet below, class C is trying to inherit from Class A and B at the same time. This is not allowed in C#. This will lead to a compile time 

error: Class ‘C’ cannot have multiple base classes: ‘A’ and ‘B’.

public class A

{

}

public class B

{

}

public class C : A, B

{

}

In C# Multi-Level inheritance is possible. Code snippet below demonstrates mlti-level inheritance. Class B is derived from Class A. Class C is derived from Class B. So class C, will have access to all members present in both Class A and Class B. As a result of multi-level inheritance Class has access to A_Method(),B_Method() and C_Method().

Note: Classes can inherit from multiple interfaces at the same time. Interview Question: How can you implement multiple inheritance in C#? Ans : Using Interfaces. We will talk about interfaces in our later article.

Using System;

Public class A

{

    Public void A_Method ()

    {

        Console.WriteLine (“Class A Method Called”);

    }

}

Public class B: A

{

    Public void B_Method ()

    {

        Console.WriteLine (“Class A Method Called”);

    }

}

Public class C: B

{

    Public void C_Method ()

    {

        Console.WriteLine (“Class A Method Called”);

    }

                   

    Public static void Main ()

    {

        C C1 = new C ();

        C1.A_Method ();

        C1.B_Method ();

        C1.C_Method ();

    }

}

When you derive a class from a base class, the derived class will inherit all members of the base class except constructors. In the code snippet below class B will inherit both M1 and M2 from Class A, but you cannot access M2 because of the private access modifier. Class members declared with a private access modifier can be accessed only with in the class. We will talk about access modifiers in our later article.

Common Interview Question: Are private class members inherited to the derived class?

Ans: Yes, the private members are also inherited in the derived class but we will not be able to access them. Trying to access a private base class member in the derived class will report a compile time error.

Using System;

Public class A

{

Public void M1 ()

{

}

Private void M2 ()

{

}

}

Public class B: A

{

Public static void Main ()

{

B B1 = new B ();

B1.M1 ();

//Error, Cannot access private member M2

//B1.M2 ();

}

}

Method Hiding and Inheritance We will look at an example of how to hide a method in C#. The Parent class has a write () method which is available to the child class. In the child class I have created a new write () method. So, now if I create an instance of child class and call the write () method, the child class write () method will be called. The child class is hiding the base class write () method. This is called method hiding.

If we want to call the parent class write () method, we would have to type cast the child object to Parent type and then call the write () method as shown in the code snippet below.

Using System;

Public class Parent

{

    Public void Write ()

    {

        Console.WriteLine (“Parent Class write method”);

    }

}

 

Public class Child: Parent

{

    Public new void Write ()

    {

        Console.WriteLine (“Child Class write method”);

    }

   

    Public static void Main ()

    {

        Child C1 = new Child ();

        C1.Write ();

        //Type caste C1 to be of type Parent and call Write () method

        ((Parent) C1).Write ();

    }

}

Polymorphism:

When a message can be processed in different ways is called polymorphism. Polymorphism means many forms.

 

Polymorphism is one of the fundamental concepts of OOP.

 

Polymorphism provides following features: 

  • It allows you to invoke methods of derived class through base class reference during runtime.
  • It has the ability for classes to provide different implementations of methods that are called through the same name. 

Polymorphism is of two types:
 

  1. Compile time polymorphism/Overloading
  2. Runtime polymorphism/Overriding

Compile Time Polymorphism

 

Compile time polymorphism is method and operators overloading. It is also called early binding.

 

In method overloading method performs the different task at the different input parameters.

 

Runtime Time Polymorphism

 

Runtime time polymorphism is done using inheritance and virtual functions. Method overriding is called runtime polymorphism. It is also called late binding.

 

When overriding a method, you change the behavior of the method for the derived class. Overloading a method simply involves having another method with the same prototype.

 

Caution: Don’t confused method overloading with method overriding, they are different, unrelated concepts. But they sound similar.

 

Method overloading has nothing to do with inheritance or virtual methods.

 

Following are examples of methods having different overloads:

 

void area(int side);

void area(int l, int b);

void area(float radius);

 

Practical example of Method Overloading (Compile Time Polymorphism)

 

using System;

 

namespace method_overloading

{

    class Program

    {

        public class Print

        {

           

            public void display(string name)

            {

                Console.WriteLine (“Your name is : “ + name);

            }

 

            public void display(int age, float marks)

            {

                Console.WriteLine (“Your age is : “ + age);

                Console.WriteLine (“Your marks are :” + marks);

            }

        }

       

        static void Main(string[] args)

        {

 

            Print obj = new Print ();

            obj.display (“George”);

            obj.display (34, 76.50f);

            Console.ReadLine ();

        }

    }

Note: In the code if you observe display method is called two times. Display method will work according to the number of parameters and type of parameters.

When and why to use method overloading

 

Use method overloading in situation where you want a class to be able to do something, but there is more than one possibility for what information is supplied to the method that carries out the task.

 

You should consider overloading a method when you for some reason need a couple of methods that take different parameters, but conceptually do the same thing.

 

Method overloading showing many forms.

 

using System;

 

namespace method_overloading_polymorphism

{

    Class Program

    {

        Public class Shape

        {

            Public void Area (float r)

            {

                float a = (float)3.14 * r;

                // here we have used function overload with 1 parameter.

                Console.WriteLine (“Area of a circle: {0}”,a);

            }

 

            Public void Area(float l, float b)

            {

                float x = (float)l* b;

                // here we have used function overload with 2 parameters.

                Console.WriteLine (“Area of a rectangle: {0}”,x);

 

            }

 

            public void Area(float a, float b, float c)

            {

                float s = (float)(a*b*c)/2;

                // here we have used function overload with 3 parameters.

                Console.WriteLine (“Area of a circle: {0}”, s);

            }

        }

 

        Static void Main (string[] args)

        {

            Shape ob = new Shape ();

            ob.Area(2.0f);

            ob.Area(20.0f,30.0f);

            ob.Area(2.0f,3.0f,4.0f);

            Console.ReadLine ();

        }

    }

 

Things to keep in mind while method overloading

 

If you use overload for method, there are couple of restrictions that the compiler imposes.

 

The rule is that overloads must be different in their signature, which means the name and the number and type of parameters.

 

There is no limit to how many overload of a method you can have. You simply declare them in a class, just as if they were different methods that happened to have the same name.

Method Overriding:

Whereas Overriding means changing the functionality of a method without changing the signature. We can override a function in base class by creating a similar function in derived class. This is done by usingvirtual/override keywords.

Base class method has to be marked with virtual keyword and we can override it in derived class usingoverride keyword.

Derived class method will completely overrides base class method i.e. when we refer base class object created by casting derived class object a method in derived class will be called.

Example: 

// Base class
public class BaseClass
{
public virtual void Method1()
{
Console.Write(“Base Class Method”);
}
}
// Derived class
public class DerivedClass : BaseClass
{
public override void Method1()
{
Console.Write(“Derived Class Method”);
}
}
// Using base and derived class
public class Sample
{
public void TestMethod()
{
// calling the overriden method
DerivedClass objDC = new DerivedClass();
objDC.Method1();
// calling the baesd class method
BaseClass objBC = (BaseClass)objDC;
objDC.Method1();
}
}

Output
———————

Derived Class Method Derived Class Method

Constructors and Destructors:

Classes have complicated internal structures, including data and functions, object initialization and cleanup for classes is much more complicated than it is for simple data structures. Constructors and destructors are special member functions of classes that are used to construct and destroy class objects. Construction may involve memory allocation and initialization for objects. Destruction may involve cleanup and deallocation of memory for objects.

  • Constructors and destructors do not have return types nor can they return values.
  • References and pointers cannot be used on constructors and destructors because their addresses cannot be taken.
  • Constructors cannot be declared with the keyword virtual.
  • Constructors and destructors cannot be declared const, or volatile.
  • Unions cannot contain class objects that have constructors or destructors.

Constructors and destructors obey the same access rules as member functions. For example, if you declare a constructor with protected access, only derived classes and friends can use it to create class objects.

The compiler automatically calls constructors when defining class objects and calls destructors when class objects go out of scope. A constructor does not allocate memory for the class object it’s this pointer refers to, but may allocate storage for more objects than its class object refers to. If memory allocation is required for objects, constructors can explicitly call the new operator. During cleanup, a destructor may release objects allocated by the corresponding constructor. To release objects, use the delete operator.

Example of Constructor

class C

{

       private int x;    

       private int y;

       public C (int i, int j)

       {

                 x = i;

                 y = j;

       }

       public void display ()     

       {

               Console.WriteLine(x + “i+” + y);

       }

}

Example of Destructor

class D

{

        public D ()

        {

            // constructor

        }         

        ~D ()

        {

           // Destructor

        }

}

http://pramadha.com/