OOPS Concepts
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 a Student (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.
To know more about Encapsulation check this Encapsulation in C# with Examples.
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
To know more about abstraction check this Abstraction in c# with Examples.
To know more about abstraction check this Abstraction in c# with Examples.
.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.
To know more about access specifiers, check this Access Modifiers in C# with Examples
To know more about access specifiers, check this Access Modifiers in C# with Examples
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:
Output:
Base Class Constructor executed
Child Class Constructor executed
Write method in Base Class 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
}
{
//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.
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?
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.
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:
- Compile time
polymorphism/Overloading
- 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:
Base class method has to be marked with virtual keyword and we can override it in derived class using override 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 classpublic 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.
class C
To know more about constructors, check this Constructors in C# with Examples.
Example of Destructor
{
private int x;
private int y;
public C (int i, int j)
{
x = i;
y = j;
}
public void display
()
{
Console.WriteLine(x + "i+"
+ y);
}
}To know more about constructors, check this Constructors in C# with Examples.
Example of Destructor
class D
{
public D ()
{
// constructor
}
~D ()
{
// Destructor
}
}
If you enjoyed this post, please support the blog below. It's FREE! Get the latest Asp.net, C#.net, VB.NET, jQuery, Plugins & Code Snippets for FREE by subscribing to our Facebook, Twitter, RSS feed, or by email. |
|||
|
|||
502 comments :
«Oldest ‹Older 201 – 400 of 502 Newer› Newest»lovely concepts within 30 minutes i clear my all concepts:)
nice
thankx and it is so uefull to me
how we can send group sms in .net using c#
wonderful and lucid explanation
very nice article...very simple explanation to understand oop concept properly:):)
Excellent work. All concepts of opps at one place.
I am stuck at one place. When I was doing the practicle for method hiding example then I got the compile time error. The below line doesn't work:
((Parent) C1).Write ();
Even I use the same example mentioned by you:-
using System;
public class Parent
{
public void Write()
{
Console.WriteLine("Base class M1 method");
}
}
public class Child : Parent
{
public new void Write()
{
Console.WriteLine("Child class M1 method");
}
public static void main()
{
Child C1 = new Child();
C1.Write();
((Parent)C1.)Write ();
}
}
its very useful notes for begginer thanks for that notes i understand all the conceot
tnx for this it is very much helped me
This is very nice article for beginners.
Thanx Suresh, Keep it up.
chance illa anna... really this article is very helpful for every student.... tanx a lot
thanks
nice article
thanx for article it useful to understand the concept easily
good
Tooo Gud..... Keep it up:-)
nice and simple!!!
Keep Rocking
Class is not the collection on object.
If Class is collection of objects then what is object?
In pure OOP terms an object is an instance of a class
So class can't be collection of objects.
Thanks buddy nice explaination.
It's very useful....very nice
very nice article for beginers.......
Excellent..........
i have started studying blank in OOPs knowledge,
but after go thorough this valuable concepts
now am comfortable to write program !!!!
child c=new base();
or
base d=new child();
out of this which is possible...
Nice Article of OOPS Good Work Keep it up...
Simple and easily understandable...
tripple like dear..
Excellent,fabulous it is easy and simple to understand.
Hi Suresh,
i am impressed with your given artical
Thanks
Uttam
9999890039
Yes, It really nice artical for OOPs Concept
Very nice, able to understand quite well.
Thank you.
Hats Of 2 U Mr....
I Clear All My Concepts....
Thnk u.....
i Nevr thought ..Ki this is Very eassyy
Very good article for beginners. Thanks.
superb :)
good examples...
Good explanation with examples.
Prathap Kumar
.Net Training
very nice
this article is taken from code project
thk u ......
its easy to understand,,,,,,,v need more.......
i expct lot,,,,,but i cont get,,,,,
thk u
Good Job
its explained very clearly .
thanks Sir
Very Nice Article you have posted .. I am reader of
your Article
Hi.. This is Gangadhar
I suddenly got this site while searching some concept of OOPS and having read it I got surprised ...
Thank U so much
Encapsulation is hiding up the complexities by implementing some functionalities.
example is function which had complex functionality used in a simple manner by hiding its complex logic where ever we needed.
its really healpfull for me .....thanks alot sir
very nice article and it's very use full for developer and learner...
Thank u very much...
thanks
Explained very well
very nice article...
Corection on Method Overloading:
Here the signature of the methods includes:Type of the parameter, Number of parameters And Order(in which they appear) of the parameters. Not the name of the parameter.
nice and simple it's use-full to beginners
nice its usefull to beginners
Good Work.......Thanks
mind blowing.....suresh..........thanks
Hello Dear, are you genuinely visiting this web site
regularly, if so after that you will definitely get pleasant knowledge.
Also visit my blog - Energy saving Kwazulu natal
very useful n understandable for new comers...
U do good as usual,very Thankful 2 u
What is difference between Overriding and Method Hiding(Shadowing)?
Very Informative
so good article
Thank u mr Suresh. I always find your artical very helpful this is too... keep it on...
this is very very nice article for oops concepts
good article with good explination
power of Dotnet. Suresh Rockssss
Its very useful article for beginners too.....
very useful...thank u so much....
It's very useful. Please add few more topics and share with us
not so good.......Try to improve more
GOod work Suresh.... Simple explaination, strikes direct to the brain...Thank you...!!!
@Suresh : A class is not a collection of object.
http://msdn.microsoft.com/en-us/library/dd460654.aspx
Thanks Suresh
Very good explanations and examples.
HI suresh very nice
Nice Article
nice work....
It is very nice article...
Good work...
It's relay helpfully....
Thanks...
Sir g......... You Are Great..........
Its very nice content at single place for study.
good that explanation
Good work....
very nice. Too many sites are there explaining oops concept. Most of them are more complicated to understand and very high language is used. U have explained it in simple and anybody can understand the concept of oops. Thanks.
hello sir
Great job!
Excellent Article
Thanks a lot
Nice article with basics..Thank you for the good work...
HI,
it's so good work.......
thanks for presenting.
Good article.
good work
Thank you Very Much for giving those valiable things
Question--can we implement all of interface methods in diffrent clasess..
example-- INTERFACE A has 3 methods..like x,y,z..can we implent x in A class,y in B class,z in C class.......
Really Help full.thnks
thanks
.Keep up the good work. suresh......expecting more articles for professionals.
thanx for this blog,its very useful and simple to understand.
Thanks .Keep posting new things
Expert works, thanks a lot.
Thank You So Much Mr.Suresh
It is very very useful for my reference.
Prince: Please explain why multiple inheritance is not possible through classes.
Software Developer
Seasia Infotech Pvt ltd
Very Useful
good one......
Nice article and good work..
Please refer Oops Concept Interview Questions
It is really very helpful.
Refreshes the basics concepts of OOPS.
Thank you.
thank u sir. i am your fan...
It s very useful and easy to understand..Thank you Suresh.......
Gud
Nice
good article with examples..easy to understand
great work mate u rock
superb man, very helpfull.
Great article...
prodigious dude........
Akshay
Good
nice dude
Very Nice Sir.......nice explenation
Good work.
nice artile.. thanku
gud work suresh
Nice articles Suresh. I am fan of your website,
Thanks Plz Keep in depth details on MVC, WCF and WPF.
Thanks
PBN.
Good Article Suresh......Keep doing
Nice blog... it is good for beginners
such a good description,thanks.
good job..simple and clear
Thanks for this article i learn so much from here. I am in learning stage and i also like to write articles but i never read article that explain everything in such a simple way
Thanks Mr Suresh for such a nice thing
it's very nice Suresh, thank you so much.
good
Thanks for the article. It is very useful for a beginner like me..
poda eruma ungalukku vera velaiye illaya da sunni..........
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooowwwwww nice ya and super subject
poda eruma ungalukku vera velaiya illaya da sunni.................
nice and usefull to understant
this will help us to gain more knowledge about concepts......
thx.... 9965656611
Thank u very much for your wonderful job.. It is really very much useful for the beginners.. Keep publishing this type of articles..
thanq for clearing ma consequences
thanks Good one.
Birendra Pandey
thank sir it's very nice and very useful me
tgdbgfb
nice--truly helpfull
Good work
keep it up......
Thank you .It is very usefull
good work ..
very nice article but there is not concept about delegate and event
Simple and sweet
Thanks a lot ... keep going...
Very good refreshing material. Thanks you.
Good Work
Very helpful and quick for refreshing concepts for interview..
Good work.
Thanks!!!
I Appreciate!!!
Thanking you sir... u r so great...
thank you sir. it is very useful to interview preparation.
very useful
obj.s =10; //Errror Static data can be accessed by class names only...
Sir S type variable can't be declared ...how can used this....i know this is a little mistake..Good job sir...
simply superbbb....pls provide sme more defintions,examples also..
Awesome.....
Easy to Understand.....
Suresh Nice article...
hi suresh. thnks.
keep it up
U R The Best
easy to understand oops concepts.. nice
enjoyed.. good to understand
goood... its reallly very useful...
thanks
very good sir !!!!!!!!!!!!!!!!!!
Good... Thx. I need to learn oop c#
very nice article, keep up the good work
Good work ..
Really help full.........
add more interview questions....this was very good
superb
Superb Suresh... Thanks alot... its very usefull...
it is very important and most useful post for engineers, students, trainees, professionals and employees. it provide valuable, easy way and informatics data about each topic of oops. Thanks sir.
good nd nice article
Nice1
Its very useful and easy to understand...Thanks a lot...
nice and cute examples thanku
Good Article !!! Thanks
SanthaKumari:
Chanceless...no words to tell..........very good article
Very useful article
Realy, this is very conprehensible.
kya baat he. bade kam ki chiz he. lage raho
Please try sharing the remaining OOPS conceps too. This was good too.
Nice Tutorial
Very Useful information
NICE & THANKS
This article is very nice. Go through it, it will help a lot for basic oops features.
hi sir this is narayana,basically iam from andhra,now iam doing bpo job in gurgaon simultaniously i will try to .net job,actually i did my mca 2010,me site follow avuthuuntanu,,naku konacham help cheyyagalara plz my mobile no 08447663552
good work thank you.....
Very Nice....
good article
Detailed description any very easy to understand thank u soo much i need interface concept
Suresh ji,
Class is a collection of Object, is not Correct.
Its nice one. Thanks for Posting...
your web site is really very gud for beginers
very nice article...!!!
thanks
very useful article.. good job suresh
good explains
very nice article for brush up your concepts....
Good work Suresh :)
thanx for article it useful to understand the concept easily
Sweet and simple ... thank you very much
good work....!!
Mr.suresh g......
Note: Only a member of this blog may post a comment.