Sunday, June 7, 2015

Object Oriented Programmings: Prevent/Allow Inheritance and Prevent/Allow Instantiate

Hello friend,

In this post I am explaining about 4 scenarios which might occur in any real time project or required while implementing an application. Coding is done in C#. but I am sure similar concepts are available in other languages as well like Java.

  1. Implement class which is allowed to inherit and allowed to create instance
  2. Implement class which is allowed to inherit but not allowed to create instance
  3. Implement class which is not allowed to inherit and allowed to create instance
  4. Implement class which is not allowed to inherit and not allowed to create instance

1. Implement class which is allowed to inherit and allowed to create instance

This is the simplest implementation, just create a public class and it will be allowed to inherited and also allowed to create object of this type of class.
    class Class1
    {
        public virtual void Method1()
        {
            Console.WriteLine("In class 1");
        }
    }
    class Class2 : Class1
    {
        public override void Method1() {
            Console.WriteLine("Method1 In class 2");
        }
        public void Method2()
        {
            Console.WriteLine("In class 2");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Class2 c2 = new Class2();
            c2.Method1();   // Print: Method1 in class 2
        }
    }

2. Implement class which is allowed to inherit but not allowed to create instances

To prevent instances of a class is very common feature required for any application. I would like to add one real scenario here in which there is requirement to prevent creating object of class. Suppose we want create one application where we manage employee data for an organization and this organization has 2 types of employee, first Permanent type and second Contract type. There are many properties and behaviors which are common in both type of employees, so we will create one base class to write all the properties and methods. Now if we created this base class with just simple public access modifier, then any one (developer) can create instance of this base class, while conceptually developer should only allow to create object of Permanent employee class or Contract employee class because base employee is not a real employee (there is no existence of only employee in real world, an employee is Permanent employee or Contract employee in this organization1). So to prevent developer creating object of base Employee class, we can use concept of abstract class. Abstract class can not be instantiated, but can be inherited. All the abstract methods of abstract class must be overridden by derived class. Abstract class can also have methods which are not not abstract and full body declaration. If we try to create object of abstract class, compiler will show error as shown below:
We can inherit abstract class easily and implement abstract methods in derived class, as shown below:
abstract class Class1
    {
        public abstract void Method1();
    }
    class Class2 : Class1
    {
        public override void Method1() {
            Console.WriteLine("Abstract method body declaration");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Class1 c1 = new Class2();
            c1.Method1(); // Print: Abstract method body declaration
            Console.Read();
        }
    }
Interface also prevent instantiate, you can not create object of an interface. The interface methods must be overridden while abstract class methods can be overridden.

3. Implement class which is not allowed to inherit and allowed to create instance

C# provide sealed modifier which prevent any class to inherit. You will get error if try to inherit sealed class as shown below:
Below code shows how to use sealed modifier and we can create object of sealed type class easily:
    sealed class Class1
    {
        public void Method1()
        {
            Console.WriteLine("In class1");
        }
    }
    class Class2
    {
        public void Method1()
        {
            Console.WriteLine("In Class2");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Class1 c1 = new Class1();
            c1.Method1();
            Console.Read();
        }
    }
Java provide final modifier to prevent inheritance.

4. Implement class which is not allowed to inherit and not allowed to create instance

To prevent inheritance and instantiate both we can use private constructor of that class. If class constructor access modifier is private then it can not be instantiate as well as inherit from any class as shown below:
Private constructor is used in many application, for example we want to create Utility class and methods of this class should be available directly without creating object of this class, below code shows how to do this:
class Class1
    {
        private Class1()
        {
        }
        public static void Method1()
        {
            Console.Write("class1 static method");
        }
    }
    class Class2
    {
        public void Method1()
        {
            Console.Write("In Class2");
            Class1.Method1();
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Class2 c2 = new Class2();
            c2.Method1(); // Print: In Class2 class1 static method
            Console.Read();
        }
    }
Please feel free to give any suggestion if I have written any thing incorrect.


Tuesday, June 2, 2015

JavaScript's 9 Native Object Constructors

In JavaScript almost everything is object or act like object. Most values (excluding primitive values) involve object being created or instantiated from constructor function. An object returned from the constructor is called an instance. JavaScript uses native constructor to build everything.

JavaScript has nine native constructors to achieve everything in JavaScript programming language. For example functions are objects created from Function() constructor. String(), Boolean() and Number() constructors are not only construct objects but also provide primitive value for string, Boolean, and number.

  • String()
  • Boolean()
  • Number()
  • Object()
  • Function()
  • Array()
  • RegExp()
  • Error()
  • Date()

To remember these 9 native constructors I have created one acronym "SBN OF A RED". This acronym is easy to learn and also in relevant groups.

To create a number variable in JavaScript there are 2 ways:

  1. var iMyNumberPrimitive = 9;
  2. var iMyNumberObject = new Number(9);
First method is to just create primitive value for number, string or Boolean. Second method create complex object with primitive value. You can see below the behavior of such declarations with console:

Same way we can create other type of variables also. It is good practice to use simple primitive variable declaration always if we want normal variables operations, because JavaScript create complex object when you use constructor and will have many other properties associated with variable.

Sunday, May 24, 2015

To Do list App with Angular JS (Learn basic concepts of Angular JS)


Hello All,

Angular JS is really awesome framework created by Google, I learn just basic concepts of Angular JS from codeschool and able to create this application. This small application is a To Do list to keep track of your tasks. I created this for only running session, there is no permanent storage of tasks information.

The HTML code used for Tasks App:
Total Tasks: {{TaskCtrl.taskCounter}} Tasks Pending: {{TaskCtrl.taskPendingCounter}} Tasks Done: {{TaskCtrl.taskDoneCounter}}


Add Task

In Angular JS we can have any number of template file which can be included any where in HTML code using "ng-include" directive of Angular JS, Template file for task "TaskTemplate.html" is as shown below:

{{task.title}}: {{task.description}}
Done?

JavaScript file to create controller for Tasks App is as shown below:

(function () {
    var TaskApp = angular.module("TaskApp", []);
    var Tasks = {
        TasksDetail: [
            {
                id: 1,
                title: "Sample Task 1",
                description: "GO for Aadhar card on Saturday",
                isDone: true
            },
            {
                id: 2,
                title: "Sample Tasks 2",
                description: "Go to shopping in InOrbit on Sunday to buy jeans",
                isDone: false
            }
        ],
        TaskStarted: "Today"
    };

    TaskApp.controller("TaskController", function () {
        this.tasks = Tasks.TasksDetail;
        this.addTask = function (taskTitle, taskDetail) {
            if (!!taskTitle) {
                var task = {
                    id: this.tasks.length + 1,
                    title: taskTitle,
                    description: taskDetail,
                    isDone:false
                }
                this.tasks.push(task);
                this.updateCounter();
                this.taskTitle = "";
                this.taskDesc = "";
            } else {
                alert("Enter title");
            }
        };
        this.removeTask = function (taskId) {
            if (confirm("Task will be deleted..!")) {
                this.tasks.splice(this.getTasksIndex(taskId), 1);
                this.updateCounter();
            }
        };
        this.doneTask = function (taskId,bFlag) {
            this.tasks[this.getTasksIndex(taskId)].isDone = bFlag;
            this.updateCounter();
        };

        this.getTasksIndex = function (taskId) {
            var index = 0;
            for (index = 0; index < this.tasks.length; index++) {
                if (this.tasks[index].id == taskId) {
                    return index;
                }
            }
            return -1;
        };
        this.getTasksCounter = function (isDoneFlag) {
            var counter = 0, index = 0;
            for (index = 0; index < this.tasks.length; index++) {
                if (this.tasks[index].isDone === isDoneFlag) {
                    counter++;
                }
            }
            return counter;
        };
        this.updateCounter = function () {
            this.taskPendingCounter = this.getTasksCounter(false);
            this.taskDoneCounter = this.getTasksCounter(true);
            this.taskCounter = Tasks.TasksDetail.length;
        };
        this.updateCounter();
    });
})();

You can use the app which I have hosted here, you can try to add new tasks, try to complete the taks and delete the tasks:

Style on app is from customized CSS file, you can update CSS properties to update UI/UX. My CSS file is as shown below:

body {
    background-color: #1ec885;
    font-family: 'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif;
    color: white;
}

#TaskForm {
    color: white;
}

.Box {
    width: 150px;
    height: 20px;
    display: inline-block;
    margin-top: 5px;
}

.InputTextBox {
    width: 100%;
    border-radius: 4px;
}

.InputTextBoxDescription {
    height: 35px;
}

.Button {
    text-align: center;
    cursor: pointer;
}

.ImageButton {
    vertical-align: middle;
}

.AddButton {
    background-color: #ff6a00;
    width: 200px;
    height: 30px;
    padding-top: 10px;
}

.RemoveButton {
    background-color: #961616;
    width: 20px;
    display: inline-block;
    height: 17px;
}

.DoneButton {
    background-color: #ff6a00;
    width: 50px;
}

#TaskFormTable {
    width: 100%;
}

.TaskItem {
    margin: 5px;
}

.TaskTitle {
    font-weight: 900;
}