Lưu trữ

Archive for the ‘Lập trình hướng đối tượng’ Category

Polymorphism in C++

Đa hình (polymorphism) là tính năng rất có ích, được ứng dụng rất phổ biến trong lập trình hướng đối tượng. Trong khuôn khổ của bài viết này, tôi sẽ giới thiệu sơ lược về kỹ thuật đa hình và cách cài đặt trong C++. Nếu chúng ta đã làm quen với ngôn ngữ lập trình hướng đối tượng thì việc hiện thức nó trong những ngôn ngữ khác C++ là chuyện không quá khó khăn. Để hiểu cơ chế làm việc của polymorphism, chúng ta theo dõi ví dụ sau:

Advertisements

What is the difference between Association, Aggregation and Composition?

Xem hình này sẽ hiểu rõ hơn về sự khác nhau giữa 3 cụm từ này trong lập trình hướng đối tượng.

https://i1.wp.com/www.codeproject.com/KB/architecture/OOP_Concepts_and_manymore/association_aggre_com.gifNói chung, chúng ta có thể kết luận rằng aggregation là một trường hợp đặc biệt của một associationcomposition là một trường hợp đặc biệt của aggregation.

Phương thức static (class) và instance

Tiếp theo bài giới thiệu về Overloading và Overriding, tôi muốn tóm lại sự khác biệt cũng như điểm lưu ý của các phương thức lớp (phương thức tĩnh) và phương thức instance. Đây là hai kiểu phương thức sử dụng phổ biến trong lập trình hướng đối tượng

Phương thức lớp (tĩnh) (Static Methods): là phương thức được gọi thông qua tên lớp. Trong quá trình cài đặt phương thức chúng ta dùng từ khóa static.

Xem ví dụ:

class MyUtils {
    . . .
    //================================================= mean
    public static double mean(int[] p) {
        int sum = 0;  // sum of all the elements
        for (int i=0; i<p.length; i++) {
            sum += p[i];
        }
        return ((double)sum) / p.length;
    }//endmethod mean
    . . .
}

Muốn gọi phương thức này bên trong lớp mô tả nó, chúng ta chỉ cần sử dụng tên phương thức: mean(). Tuy nhiên, nếu gọi phương thức bên ngoài lớp chúng ta phải kèm theo tên lớp; nghĩa là: MyUtils.mean().

Phương thức instance: kết hợp với một object và các biến instance của object đó.

Ví dụ:

// File   : dialog/capitalize/Capitalize2.java
// Purpose: Capitalize first letter of each name.  Declare with first use.
// Author : Fred Swartz - placed in public domain.
// Date   : 30 Mar 2006

import javax.swing.*;

public class Capitalize2 {

    public static void main(String[] args) {
        //.. Input a word
        String inputWord = JOptionPane.showInputDialog(null, "Enter a word");

        //.. Process - Separate word into parts, change case, put together.
        String firstLetter = inputWord.substring(0,1);  // Get first letter
        String remainder   = inputWord.substring(1);    // Get remainder of word.
        String capitalized = firstLetter.toUpperCase() + remainder.toLowerCase();

        //.. Output the result.
        JOptionPane.showMessageDialog(null, capitalized);
    }
}

Các phương thức: substring, toUpperCase, toLowerCase là các phương thức instance. Các phương thức showInputDialog, showMessageDialog là các phương thức lớp.

Overloading và Overriding trong OOP

Nhiều lần nhầm lẫn cái này nên tôi bèn lập ra một trang để ghi lại sự khác biệt cơ bản của hai anh này.

Overloading:

Dịch ra tiếng Việt nghĩa theo nghĩa chuyên ngành là  quá tải lên cái đã có (nghe buồn cười quá). Thật vậy, trong OOP (Object-Oriented Programming) chúng ta có thể khai báo các phương thức (hàm) có cùng tên nhưng khác nhau về kiểu của các đối số (arguments), kiểu trả về của phương thức và cả số lượng đối số của phương thức.

Một ví dụ minh họa như sau:

Giả sử chúng ta có một lớp định nghĩa phương thức Cộng:

public class Demo {
  public int Cong(int x, int y) {
    return x + y;
  }

  public string Cong(string s1, string s2) {
    return s1.Concat(s2);
  }
}

Hai phương thức Cong định nghĩa trong cùng lớp là đặc điểm khác biệt thứ hai giữa Overloading và Overriding.

Overriding:

Nếu tách hai từ này ra thì hiểu nghĩa rõ ràng hơn. Dịch sát theo tiếng Việt là che phủ lên cái đã có (nghe lạ lạ nữa). Trong OOP, các phương thức được gọi là overriding nếu chúng có cùng đối số (cả về kiểu lẫn số lượng) nhưng được định nghĩa ở các lớp khác nhau. Cụ thể: một phương thức định nghĩa ở lớp cơ sở (base class) và phương thức kia định nghĩa ở lớp dẫn xuất (derived class).

Chúng ta xem xét ví dụ sau:

class Animal{
   public void move(){
      System.out.println("Animals can move");
   }
}

class Dog extends Animal{
   public void move(){
      super.move(); // invokes the super class method
      System.out.println("Dogs can walk and run");
   }
}

public class TestDog{
   public static void main(String args[]){
      Animal b = new Dog(); // Animal reference but Dog object
      b.move();//Runs the method in Dog class
   }
}

Một số quy tắc sử dụng phương thức overriding:

  • Danh sách đối số nên giống hoàn toàn với phương thức được overriden.
  • Kiểu trả về nên giống (hoặc là kiểu con) với kiểu trả về của phương thức được overriden được mô tả trong lớp cơ sở.
  • Mức độ truy cập bị hạn chế hơn nhiều so với phương thức được overriden ở lớp cơ sở.
  • Các phương thức instance chỉ có thể overriden nếu chúng kế thừa từ lớp cơ sở.
  • Các phương thức được mô tả final (trong java) không được overriden.
  • Các phương thức được mô tả static thì không overriden nhưng được mô tả lại.
  • Các phương thức không kế thừa sẽ không được overriden (hiển nhiên)
  • Trong một lớp dẫn xuất nằm cùng gói với lớp cơ sở của các thể hiện (instance), chúng ta có thể override tất cả các phương thức của lớp cha mà không được khai báo final hoặc private.
  • Đối với các lớp dẫn xuất nằm khác gói với lớp cơ sở, chỉ có thể override các phương thức không phải final được khai báo là public hoặc protected.
  • Các hàm tạo không thể overriden.

Một số bài báo thảo luận rằng chúng ta có thể hiểu overloading là static (easy binding) polymorphism và overriding là dynamic (late binding) polymorphism.

Tóm lại:

Overloading: Methods name same but signatures is different in the class.

Overriding:To redefine the base class method in the derived class is called overriding.

static binding: compile time binding

dynamic binding: run time binding

signatures: arguments

TechCrunch

Startup and Technology News

KTLA

Los Angeles News and Video for Southern California

GROUPE IFV - Ingénieurs France-Vietnam

La page d'information du groupe des ingénieurs france-vietnam

Journal Métro

Le site web du quotidien gratuit Métro Montréal

CHUNG ACADEMY

www.hoaichung.com

5 Continents 4 Oceans

Chuyên trang DU LỊCH và DU HỌC

VinaCode

Lập trình & Cuộc sống

Khải Đơn

Vui chơi hết ngày tháng

Love & Luce

A Canadian executive businesswoman moves to Rome, for amore & luce!

Hội Anh Em Dân Chủ

Vì một nước Việt: Dân chủ - Văn minh - Pháp trị

The Art of Scientific Communication

Advice for university students in science and engineering - by Faye Hicks, PhD, PEng

MoopenCafé - Mobile Open Café

“A mind is like a parachute. It doesn't work if it is not open.” ― Frank Zappa

Economics One

A blog by John B. Taylor

BarDev - Archive

A programming blog by Mike Barlow

NHỮNG HỒI ỨC VÀ KỶ NIỆM LỊCH SỬ

Trăm năm bia đá thì mòn, Ngàn năm bia miệng vẫn còn trơ trơ

Wine Blog

by Coco Linh

Xi'an's Og

an attempt at bloggin, nothing more...

Just Go

...as long as we're together

My Journey With Data Science

'every journey begins with a single step'