Hiển thị các bài đăng có nhãn C# Basic. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn C# Basic. Hiển thị tất cả bài đăng

Thứ Bảy, 7 tháng 8, 2010

// // Leave a Comment

Sự Khác Nhau Giữa Delegate Và Event

Chúng ta có thể làm những điều tương tự với cả hai cách sử dụng delegate và event, và dường như chúng chỉ khác nhau về cú pháp khai báo?
Bạn và tôi sẽ cùng nhau phân biệt delegate và event thông qua các ví dụ dưới đây, xem sự rõ ràng của chúng trong cách sử dụng.
Dưới đây là cú pháp khai báo:

Delegate:
public class VubkaDelegate
{
public delegate void ExampleDelegate(); public ExampleDelegate DeleageteCallback;
}
Event:
public class VubkaEvent
{
public delegate void ExampleEvent(); public event ExampleEvent EventCallback;
}

Như vậy ta mới thấy được sự khác nhau của chúng cơ bản thông qua từ khóa event
Read More

Thứ Tư, 4 tháng 8, 2010

// // Leave a Comment

Delegate là gì?

Bạn biết gì về delegate?
Bạn lập trình cũng được một thời gian dài, đặc biệt là C#. Khi sử dụng delegate bạn có bao giờ để ý đến cách khởi tạo nó không và các toán tử đi kèm có ý nghĩa như thế nào?
Cho đến hôm nay mình mới hiểu ra được các cách khởi gán delegate và ý nghĩa của nó. Việc hiểu rõ và nắm chắc delegate là điều hết sức quan trọng và nó được sử dụng hầu hết trong các ứng dụng tính toán nhiều và xử lý các sự kiện độc lập
Với delegate thì cú pháp khai báo của nó như sau:
delegate result-type identifier ([parameters]);
Ví dụ: public delegate void SimpleDelegate (params object obj)
Nghĩa là ta đi khai báo một delegate trỏ tới một phương thức có giá trị trả về là kiểu void, tham số là danh sách các params đối tượng object obj.
Multicasting:
Điều này thật thú vị khi làm việc với delegate đó là Multicasting, nghĩa là nó có thể trỏ đến nhiều hàm cùng 1 lúc (System.MulticastDelegate). Multicase delegate lưu trữ danh sách tất cả các hàm mà nó sẽ được gọi khi thực thi delegate.
Cũng giống như class, delegate có cách khai báo tương tự bằng việc sử dụng toán tử new. Ngoài ra ta có thể gán trực tiếp thông qua các phép gán thông thường =, +=, -=.
Ví dụ: Giả sử ta đang có một hàm kiểu void tên là DoSomething() không đối số, và ta khai báo một delegate như sau
public delegate void SimpleDelegate();
Thì tương ứng ta có các cách khai báo một thể hiện của SimpleDelegate như sau:
SimpleDelegate _simpleDelegate;
_simpleDelegate = new SimpleDelegate(DoSomething);
_simpleDelegate += new SimpleDelegate(DoSomething);
_simpleDelegate -= new SimpleDelegate(DoSomething);
_simpleDelegate = DoSomething;
_simpleDelegate += DoSomething;
_simpleDelegate -= DoSomething;
_simpleDelegate += DoHomework;

Và tiếp đó ta chỉ việc gọi nó ra thông qua một sự kiện cụ thể nào đó,
bằng cách:
   _simpleDelegate();
hoặc:
   _simpleDelegate.Invoke();
Read More
// // 2 comments

Sự Khác Biệt Giữa Lớp Trừu Tượng Abstract Và Giao Diện Interface

    Đối với lập trình C# hay lập trình hướng đối tượng nói chung, vấn đề kế thừa sẽ đem lại nhiều phiền toái nếu bạn chưa nắm rõ về vấn đề này. Vậy thì sự khác biệt giữa lớp abstract và interface ở chỗ nào?

    Một lớp trừu tượng thì không có thể hiện nghĩa là ta không thể khởi tạo nó bằng toán tử new, và một phương thức trong nó là abstract thì chỉ được đưa ra định nghĩa (khai báo) mà không được thực thi và nó sẽ được overriden lại trong các lớp con kế thừa. Và trong lớp mà tồn tại phương thức abstract thì lớp đó cũng được định nghĩa abstract.

    Đối với giao diện thì khác hoàn toàn với lớp trừu tượng, nó định nghĩa một cách cứng nhắc các phương thức và thuộc tính trong chúng nghĩa là không cho phép ta thực thi bất kỳ một đoạn mã nào. Và tất cả các thành viên trong nó đều được định nghĩa công khai (public). Một cách tổng quan về giao diện: Giao diện là ràng buộc, giao ước đảm bảo cho các lớp hay các cấu trúc sẽ thực hiện một điều gì đó. Khi một lớp thực thi một giao diện, thì lớp này báo cho các thành phần client biết rằng lớp này có hỗ trợ các phương thức, thuộc tính, sự kiện và các chỉ mục khai báo trong giao diện.

    Một số lưu ý khi sử dụng abstract hay interface

Một class chỉ có thể kế thừa từ một abstract class, nhưng có thể kế thừa nhiều interface.
Trong Interface chỉ có thể khai báo các fields, methods, mà không được hiện thực nó. Còn đối với abstract thì dùng các biến, hiện thực cách methods.
Các fields, methods trong interace đều là public và bắt buộc các class kế thừa phải cài đặt nó (abstract). Trong abstract class thì có các fields, methods có thể là private, internal, public, protected và có thể là abstract hoặc non-abstract.
Interface dùng để gom các hành động cần được hiện thực , các khả năng của một đối tượng, còn abstract class cho các lớp thừa kế cùng 1 loại, tính chất hay trạng thái.
Abstract class có tốc độ thực thi nhanh hơn interface.
Thêm 1 tính năng mới vào interface sẽ phá vỡ toàn bộ các lớp hiện thực, còn abstract thì không.

    Ví dụ về interface, các thành viên của interface phải được thực thi trong các lớp mà kế thừa từ nó

    public interface IPlayer
    {
        string Name
        {
            get;
            set;
        }
        Player Actor
        {
            get;
            set;
        }
        
        Bitmap Image
        {
            get;
            set;
        }
    }

    Ví dụ dưới đây khai báo một lớp abstract có các thành viên trong nó là abstract và non-abstract, và được thực thi trong lớp con là Faculty

    abstract class Employee
    {
        protected string m_str_department;
        protected double m_db_salary;
        protected int m_i_dateHired;

        public string Department
        {
            get { return m_str_department; }
            set { m_str_department = value; }
        }

        public double Salary
        {
            get { return m_db_salary; }
            set { m_db_salary = value; }
        }

        public int DateHired
        {
            get { return m_i_dateHired; }
            set { m_i_dateHired = value; }
        }

        public override string ToString()
        {
            return "Employee: " + m_str_name
            + "\nEmail: " + m_str_email;
        }

        public abstract double CalculateBonus();
        public abstract int CalculateVacation();
    }

    class Faculty : Employee
    {
        string m_str_rank;
        double m_db_hours;

        public override double CalculateBonus()
        {
            return 1000 + 0.05 * m_db_salary;
        }

        public override int CalculateVacation()
        {
            if (m_i_dateHired > 3)
            {
                if (m_str_rank == "Senior Lecture")
                    return 6;
                return 5;
            }
            if (m_str_rank == "Senior Lecture")
                return 5;
            return 4; 
        }
    }

Read More

Thứ Sáu, 18 tháng 6, 2010

// // 12 comments

Ví Dụ Nhỏ Về Đa Luồng - MultiThreading C#

  1. Sơ qua về luồng (Thread)

  2. Bài viết này mình sẽ hướng dẫn cho các bạn mới tìm hiểu về đa luồng và ứng dụng của nó và được mô tả trên ngôn ngữ C# cho dễ hiểu. Trước tìm hiểu nó cũng vất vả vì nó khó hiểu giờ muốn giúp chút xíu gì đó cho các bạn (Bạn sẽ cảm thấy vô cùng đơn giản nếu làm việc nhiều với nó, đó chỉ là do kỹ năng của mình yếu lên cảm thấy phức tạp)
    Một luồng là một chuỗi liên tiếp những sự thực thi (mã lệnh hay câu lệnh) trong chương trình (ứng dụng). Trong một chương trình C#, dễ thấy việc thực thi được bắt đầu bằng phương thức main() và tiếp tục cho đến khi kết thúc hàm main(). Cấu trúc này rất hay cho những chương trình có một chuỗi xác định những nhiệm vụ liên tiếp, nhưng thường thì trong một chương trình ứng có nhiều hơn một công việc vào cùng một lúc. Một ví dụ rất hay và khá thực tế mà mình thấy trên diễn đàn tin học của "can_qua", các bạn cùng tham khảo


    Vấn đề quan trọng là bạn phải tìm ra một cách nào đó để chia một công việc lớn thành những công việc nhỏ mà trong đó có những việc có thể thực hiện một cách đồng thời. Ví dụ, mẹ giao việc cho con là "làm việc xong mới được đi coi xi-nê". "Công việc lớn" này có thể gồm 3 việc nhỏ "quét nhà", "rửa chén", và đi coi "xi-nê". Trong đó chỉ được "coi xi-nê" sau khi làm xong hai việc kia. Rõ ràng là bạn muốn làm xong việc nhà càng sớm càng tốt để vi vút, nên bạn kêu thằng em bạn quét nhà, bạn thì rửa chén, cả hai người cùng làm đồng thời. Rửa chén xong trước, bạn phải đợi thằng em bạn thông báo là quét nhà cũng xong thì bạn mới vù đi coi xi-nê được. Như vậy multithread cho "rửa chén" và "quét nhà" làm tăng hiệu suất thực hiện công việc của bạn (so với việc bạn làm tuần tự rửa chén, quét nhà, coi xi-nê).
  3. Ví dụ nhỏ về đa luồng
  4. Ví dụ này mình sẽ mô tả 2 luồng (cho đơn giản) được thực thi cùng một lúc.
    Ở đây thì bạn cứ tưởng tượng ra rằng có hai thằng tên là A và B thi đếm từ 0 cho đến 100, thằng nào đếm xong trước thì báo cáo và được về chỗ. Tương ứng mình sẽ tạo ra 2 phương thức A() và B() (mỗi luồng sẽ xử lý một thằng).


Read More

Thứ Ba, 27 tháng 4, 2010

// // Leave a Comment

Ôn tập phần lập trình hướng đối tượng C#

1. Lớp (Class ) và đối tượng (Object)
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0vfka0QN8SxbgThmpHctLXBFztaG6bRIZsyAbR01L6Q-zbLcC-MUGwuFfYqAWfQWbtFpJyN5vbj15ck2WPTIrbvC4bNDXfpHkTDDJ14BSQcTiLKlOj6tvwPDtsKelhcvyNUsmRuqwNIA/s640/oop.pngKhái niệm về lớp và đối tượng
Lớp là một khái niệm mô tả cho những thực thể có chung tính chất và hành vi có thể nói lớp là một khuôn mẫu cho các đối tượng. Còn đối tượng là những đại diện cho lớp, mọi đối tượng đều có chung tính chất và hành vi mà lớp định nghĩa.
Các thành phần của lớp
Các thành phần của lớp gồm: Fields, Properties Methods và các thành phần này được phân làm 2 loại là static và instance.

Trong đó :
Fields là các phần tử dùng để thể hiện các biến trong lớp.
Properties là phần tử dùng để truy cập đến đặc điểm của một đối tượng hoặc một class. Properties được định nghĩa bằng 2 phần, phần thứ nhất giống như định nghĩa Fields, phần thứ 2 có thêm 2 phần tử get và set.
Methods hay phương thức chính là các “hành vi” được định nghĩa trong class. Nó dùng để thực hiện một công việc nào đó của một đối tượng hay một class. Khi học về method bạn cần đặc biệt lưu ý đến các vấn đề về Methods overloading, Constructor, Destructor và cách truyền tham số cho method.
Lớp Abstract class và Sealed class
Là 2 lớp đặc biệt của C# trong đó:
Abstract class là lớp chứa phương thức Abstract hay phương thức ảo- tức là các phương thức chỉ được khai báo chứ không thực thi hành động nào. Abstract class chỉ được dùng làm lớp cha cho các lớp kế thừa.
Sealed class là lớp không bao giờ được kế thừa. Nếu bạn khai báo một lớp dẫn xuất từ một lớp Sealed class thì chương trình sẽ báo lỗi.

Read More

Thứ Tư, 21 tháng 4, 2010

// // Leave a Comment

Ôn tập ngôn ngữ lập trình C#

I. Nhắc lại những đặc điểm của ngôn ngữ C#

C# là một sản phẩm của microsoft, là một ngôn ngữ hướng đối tượng khá thân thiện và mềm dẻo mà bạn có thể sử dụng để xây dựng các ứng dụng desktop hay web.
C# có sẵn các thư viện với các hàm hỗ trợ mạnh cho việc lập trình.
Bạn cần  phải nhớ một số nguyên tắc sau:



  • C# là ngôn ngữ phân biệt hoa thường


  • Quy tắc đặt tên trong C#


  • Quy tắc viết chú thích.


  • Cách khai báo các thư viện dùng trong chương trình

II. Các kiểu dữ liệu trong c#

C# có 2 loại dữ liệu là dữ liệu kiểu value và dữ liệu kiể reference. Kiểu value hầu hết là những kiểu có sẵn còn kiểu reference hầu hết là những kiểu do người dùng định nghĩa. Bảng dưới đây tổng hợp các kiểu dữ liệu được xây dựng sẵn:

Kiểu
Khai báo
object
object o = null;
string
string s = "hello";
sbyte
sbyte val = 12;
short
short val = 12;
int
int val = 12;

long
long val1 = 12;
long val2 = 34L;
byte
byte val1 = 12;
ushort
ushort val1 = 12;
uint
uint val1 = 12;
uint val2 = 34U;

ulong
ulong val1 = 12;
ulong val2 = 34U;
ulong val3 = 56L;
ulong val4 = 78UL;
float
float val = 1.23F;
double
double val1 = 1.23;
double val2 = 4.56D;
bool
bool val1 = true;
bool val2 = false;
char
char val = 'h';
decimal
decimal val = 1.23M;
  
Read More
// // Leave a Comment

Namespace trong C#

Nhằm giải quyết bài toán xung đột tên class (cùng tên lớp) trong cùng một project. Cấu trúc chương trình được tổ chức theo dạng cây phân cấp như thư mục (directory). Một Namespace có thể chứa nhiều class.



Ta có thể hiểu Namespace là một gói những thực thể có thuộc tính và hành vi độc lập với bên ngoài. Những ưu điểm của namespace được liệt kê như sau:

  • Tránh được sự trùng lặp tên giữa các class.
  • Cho phép tổ chức mã nguồn một cách có khoa học và hợp lý.
Khai báo một Namespace

namespace NamespaceName
{
            // nơi chứa đựng tất cả các class
}
Trong đó,

Namespace: là từ khóa khai báo một NameSpace
NamespaceName: là tên của một Namespace

Ví dụ


namespace CSharpProgram
{
    class Basic
    {
    }
    class Advance
    {
    }
}


Để truy xuất đến 1 class thì phải truy xuất từ Namespace.
Ví dụ: gọi phương thức ghi lên màn hình Console một dòng thông báo ta làm như sau.
         System.Console.WriteLine("Hello C Sharp");
 
Sử dụng từ khoá using để rút gọn việc truy xuất một class: Thường được khai báo ở đầu tài liệu C sharp.
      using System;
 
 và câu lệnh ở trên tương đương với dòng lệnh sau:
 
      Console.WriteLine("Hello C Sharp");
Read More

Thứ Hai, 19 tháng 4, 2010

// // Leave a Comment

Struct - Kiểu cấu trúc trong C#

      Struct (kiểu cấu trúc) là kiểu dữ liệu đơn giản do người dùng định nghĩa, kích thước nhỏ có thể dùng để thay thế cho lớp. Struct cũng tương tự như lớp, cũng chứa các phương thức (methods), những thuộc tính(properties), các trường(fields), các toán tử(operators), các kiểu dữ liệu lồng bên trong và bộ chỉ mục (indexer). Có một số sự khác nhau quan trọng giữa những lớp và cấu trúc. Ví dụ, cấu trúc thì không hỗ trợ kế thừa (Inheritance)và bộ hủy (Destructor)giống như kiểu lớp. Một điều quan trọng nhất là trong khi lớp là kiểu dữ liệu tham chiếu, thì cấu trúc là kiểu dữ lịêu giá trị . Do đó cấu trúc thường dùng để thể hiển các đối tượng không đòi hỏi một ngữ nghĩa tham chiếu, hay một lớp nhỏ mà khi đặt vào trong stack thì có lợi hơn là đặt trong bộ nhớ heap. Như vậy,chúng ta chỉ nên sử dụng những cấu trúc chỉ với những kiểu dữ liệu nhỏ, và những hành vi hay thuộc tính của nó giống như các kiểu dữ liệu được xây dựng sẵn.

Trong bài này chúng ta sẽ tìm hiểu cách định nghĩa và làm việc với kiểu cấu trúc và cách sử dụng Constructror để khởi tạo những giá trị của cấu trúc.

Định nghĩa một struct

Cú pháp để khai báo một struct cũng tương tự như cách khai báo một lớp:

[thuộc tính] [bổ sung truy cập] struct [: danh sách giao diện]
{
[thành viên của cấu trúc]
}
Read More
// // Leave a Comment

Interface - Giao diện trong C#

1. Định nghĩa interface (giao diện)

Giao diện là ràng buộc, giao ước đảm bảo cho các lớp hay các cấu trúc sẽ thực hiện một điều gì đó. Khi một lớp thực thi một giao diện, thì lớp này báo cho các thành phần client biết rằng lớp này có hỗ trợ các phương thức, thuộc tính, sự kiện và các chỉ mục khai báo trong giao diện.

Một giao diện thì giống như một lớp chỉ chứa các phương thức trừu tượng. Một lớp trừu tượng được dùng làm lớp cơ sở cho một họ các lớp dẫn xuất từ nó. Trong khi giao diện là sự trộn lẫn với các cây kế thừa khác.

Tuy nhiên bạn phải hiểu là giao diện không phải là lớp.
Sau đây sẽ giới thiệu với bạn cách định nghĩa và thực thi một giao diện
Cú pháp để định nghĩa một giao diện như sau:


 [thuộc tính] [phạm vi truy cập] interface <tên giao diện> [: danh sách cơ sở]
 {
  /* phần thân giao diện */
 }


Phần thuộc tính chúng ta chưa đề cập tới các bạn hãy lưu ý đến phần phạm vi truy cập bao gồm public, private, protected, internal, và protected internal đã được nói đến. Theo sau từ khóa interface là tên của giao diện. Thông thường tên của giao diện được bắt đầu với từ I hoa (điều này không bắt buộc nhưng việc đặt tên như vậy rất rõ ràng và dễ hiểu, tránh nhầm lẫn với các thành phần khác).

Danh sách cơ sở là danh sách các giao diện mà giao diện này mở rộng, phần này sẽ được trình bày trong phần thực thi nhiều giao diện. Phần thân của giao diện chính là phần thực thi giao diện.

2. Thực thi giao diện

Giả sử chúng ta muốn tạo một giao diện nhằm mô tả những phương thức và thuộc tính của một lớp cần thiết để lưu trữ và truy cập từ một cơ sở dữ liệu hay các thành phần lưu trữ dữ liệu khác như là một tập tin. Chúng ta quyết định gọi giao diện này là IStorage. Trong giao diện này chúng ta xác nhận hai phương thức: Read() và Write(), khai báo này sẽ được xuất hiện trong phần thân của giao diện như sau:


    interface IStorable
    {
        void Read();
        void Write(object);
    }


Mục đích của một giao diện là để định nghĩa những khả năng mà chúng ta muốn có trong một lớp. Ví dụ, chúng ta có thể tạo một lớp tên là Document, lớp này lưu trữ các dữ liệu trong cơ sở dữ liệu, do đó chúng ta quyết định lớp này này thực thi giao diện IStorable. Để làm được điều này, chúng ta sử dụng cú pháp giống như việc tạo một lớp mới Document được thừa kế từ IStorable bằng dùng dấu hai chấm (:) và theo sau là tên giao diện:


    public class Document : IStorable
    {
        public void Read()
        {
            // ...
        }
        public void Write()
        {
            //...
        }
    }



Dưới đây là code minh họa việc thực thi giao diện:

    using System;

    // khai báo giao diện
    interface IStorable
    {
        // giao diện không khai báo bổ sung truy cập
        // phương thức là public và không thực thi (chỉ khai báo)
        void Read();
        void Write(object obj);
        int Status
        {
            get;
            set;
        }
    }

    // tạo một lớp thực thi giao diện IStorable
    public class Document : IStorable
    {
        public Document( string s)
        {
            Console.WriteLine("Creating document with: {0}", s);
        }

        // thực thi phương thức Read()
        public void Read()
        {
            Console.WriteLine("Implement the Read Method for IStorable");
        }

        // thực thi phương thức Write
        public void Write( object o)
        {
            Console.WriteLine("Impleting the Write Method for IStorable");
        }

        // thực thi thuộc tính
        public int Status
        {
            get
            {
                return status;
            }
            set
            {
                status = value;
            }
        }

        // khai báo trường dữ liệu status
        private int status = 0;
    }

    public class Tester
    {
        static void Main()
        {
            // khởi tạo đối tượng Document
            Document doc = new Document("Test Document");
            doc.Status = -1;
            doc.Read();
            Console.WriteLine("Document Status: {0}", doc.Status);

            // khởi gán một giao diện
            IStorable isDoc = (IStorable) doc;
            isDoc.Status = 0;
            isDoc.Read();

            Console.WriteLine("IStorable Status: {0}", isDoc.Status);
            Console.ReadLine();
        }
    }

3. Thực thi nhiều giao diện


Trong ngôn ngữ C# cho phép chúng ta thực thi nhiều hơn một giao diện. Ví dụ, nếu lớp Document có thể được lưu trữ và dữ liệu cũng được nén. Chúng ta có thể chọn thực thi cả hai giao diện IStorable và ICompressible. Như vậy chúng ta phải thay đổi phần khai báo trong danh sách cơ sở để chỉ ra rằng cả hai giao diện điều được thực thi, sử dụng dấu phẩy (,) để phân cách giữa hai giao diện:

    public class Document : IStorable, ICompressible



Khi đó lớp Document phải thực hiện đầy đủ các method được khai báo trong ICompressible.
4. Mở rộng giao diện


C# cung cấp chức năng cho chúng ta mở rộng một giao diện đã có bằng cách thêm các phương thức và các thành viên hay bổ sung cách làm việc cho các thành viên. Ví dụ, chúng ta có thể mở rộng giao diện ICompressible với một giao diện mới là ILoggedCompressible. Giao diện mới này mở rộng giao diện cũ bằng cách thêm phương thức ghi log các dữ liệu đã lưu:

    interface ILoggedCompressible : ICompressible
    {
        void LogSavedBytes();
    }

5. Kết hợp giao diện

Một cách tương tự, chúng ta có thể tạo giao diện mới bằng cách kết hợp các giao diện cũ và ta có thể thêm các phương thức hay các thuộc tính cho giao diện mới. Ví dụ, chúng ta quyết định tạo một giao diện IStorableCompressible. Giao diện mới này sẽ kết hợp những phương thức của cả hai giao diện và cũng thêm vào một phương thức mới để lưu trữ kích thước nguyên thuỷ của các dữ liệu trước khi nén:



    interface IStorableCompressible : IStoreable, ILoggedCompressible
    {
        void LogOriginalSize();
    }

Các bạn đã được làm quen với một khái niệm nữa trong C# đó là giao diện (interface). Cách định nghĩa và thực thi một interface, các thực thi nhiều interface, mở rộng và kết hợp các interface.
Read More

Chủ Nhật, 18 tháng 4, 2010

// // 2 comments

Abstract Class và Sealed class

Abstract :
- C# cho phép lớp phương thức hay thuộc tính có thể khai báo abstract. Một lớp abstract không được thể hiện và một phương thức abstract chỉ được đưa ra định nghĩa không được thực thi mà phải được overriden trong bất kỳ lớp kế thừa thừa từ nó. Một phương thức abstract sẽ tự động được khai báo virtual. Nếu một lớp có phương thức abstract thì nó cũng là lớp abstract và được khai báo như sau:
Những lớp được định nghĩa bằng cách dùng từ khóa abstract thì không cho phép khởi tạo đối tượng của lớp ấy.

abstract class Shape
{
      public abstract float calculateArea();      
public void displaySomething()
      {
            Console.WriteLine("Something is displayed");
}
}
class Circle:Shape
{
     float radius;
     public override float calculateArea()
     {
          return radius * 22 / 7;
     }
}

Read More
// // 1 comment

Đa hình - Polymorphism

Xét ví dụ:

using System;
using System.Collections.Generic;
using System.Text;

namespace __OOP_polymorphism
{
    class Program
    {
        static void Main(string[] args)
        {
            Child objchild = new Child();
            Console.WriteLine("Result is " + objchild.methodA().ToString());
            Console.Read();
        }
    }
    class Parent
    {
        public int methodA()
        {
            return methodB() * methodC();
        }
        public virtual int methodB()
        {
            return 1;
        }
        public int methodC()
        {
            return 2;
        }
    }
    class Child : Parent
    {
        public override int methodB()
        {
            return 3;
        }

    }
  
}

Kết quả chạy trương trình

image008.jpg 


Như bình thường của mô hình kế thừa, kết quả trả về khi gọi hàm methodA() từ đối tượng của lớp Child phải là “Result is 2”. Nhưng trong kết quả trên, kết quả là “Result is 6”. Kết quả này do hàm methodB() tại lớp Child đã override hàm methodB() tại lớp Parent.

Vậy ta có thể khái quát Polymorphism như sau:


  • Polymorphism không chỉ đơn giản là overriding, mà nó là overrding thông minh.

  • Khác biệt giữ Overriding và Polymorphism đó là trong Polymorphism, sự quyết định gọi hàm được thực hiện khi chương trình chạy.
Read More

Thứ Sáu, 16 tháng 4, 2010

// // 1 comment

Sự kế thừa trong C#

    Có 2 kiểu kế thừa trong lập trình hướng đối tượng là đơn kế thừa (kế thừa từ nhiều lớp) và đa kế thừa (kế thừa từ nhiều lớp). C# chỉ cung cấp mô hình đơn kế thừa. Điều này có nghĩa là bạn chỉ được phép kế thừa từ một lớp cơ sở (lớp cha). Nhưng thay vào đó thì một lớp có con có thể được kế thừa từ nhiều giao diện Interface.
    Ví dụ về kế thừa trong C#.

    /* Ví dụ về thừa kế trong lậ trình C# */
    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace __OOP_Inheritance
    {
        class Program
        {
            static void Main(string[] args)
            {
                Dog objDog = new Dog(4);
                objDog.displayProperties();
                Chicken objChicken = new Chicken(2);
                objChicken.displayProperties();
                Console.Read();
            }
        }

        class Animal
        {
            protected int ifoots;
            protected string sName;

            protected void setFoot(int ival)
            {
                ifoots = ival;
            }

            protected void setName(string sVal)
            {
                sName = sVal;
            }

            public void displayProperties()
            {
                Console.WriteLine(sName + " have " + ifoots.ToString()+ " foots");
            }
        }

        class Dog : Animal
        {
            public Dog(int ival)
            {
                setName("Dog");
                ifoots = ival;
            }
        }

        class Chicken : Animal
        {
            public Chicken(int ival)
            {
                setName("Chicken");
                setFoot(ival);
            }
        }
    }
    


    Ở ví dụ trên, Dog và Chicken là hai lớp kế thừa từ lớp Animal, do đó các thuộc tính như số chân, ifoots và tên sName đương nhiên xuất hiện trong hai lớp này và cho phép sử dụng. Tương tự, các hàm như setName(), setFoot(), displayProperties()  tại lớp Animal cũng được kế thừa xuống hai lớp Dog và Chicken. Do đó ta có thể gọi những hàm này, và kết quả hiển thị khi gọi hàm displayProperties()  theo đối tượng objDog và objChicken khác nhau như hình trên.

    Một lưu ý trong thừa kế đấy là Overriding method. Nếu một hàm được định nghĩa trong lớp con có cùng tên, kiểu với hàm trong lớp cha, khi ấy hàm trong lớp con sẽ overrides (làm ẩn) hàm trong lớp cha. Đó được gọi là overriding.

    Ví dụ về Overriding:

    /* Ví dụ về thừa kế,overrding trong lập trình C# */
    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace __OOP_Inheritance
    {
        class Program
        {
            static void Main(string[] args)
            {
                Dog objDog = new Dog(4);
                objDog.displayProperties();
                Chicken objChicken = new Chicken(2);
                objChicken.displayProperties();
                Tiger objTiger = new Tiger(4);
                objTiger.displayProperties();
                Console.Read();
            }
        }

        class Animal
        {
            protected int ifoots;
            protected string sName;

            protected void setFoot(int ival)
            {
                ifoots = ival;
            }

            protected void setName(string sVal)
            {
                sName = sVal;
            }

            public virtual void displayProperties() // chú ý hàm này
            {
                Console.WriteLine(sName + " has " + ifoots.ToString()+ " foots");
            }
        }

        class Dog : Animal
        {
            public Dog(int ival)
            {
                setName("Dog");
                ifoots = ival;
            }
        }

        class Chicken : Animal
        {
            public Chicken(int ival)
            {
                setName("Chicken");
                setFoot(ival);
            }

            public void displayProperties()
            {
                base.displayProperties();
                Console.WriteLine(sName + " have " + ifoots.ToString() + " foots (from Chicken class)");
            }
        }

        class Tiger : Animal
        {
            public Tiger(int ival)
            {
                setFoot(ival);
            }

            public override void displayProperties() // chú ý hàm này
            {
                Console.WriteLine("Tiger has " + ifoots.ToString()+ " foots");
            }
        }
    }
    

    Hàm displayProperties() trong lớp Tiger overrides hàm displayProperties() trong lớp Animal.
Read More
// // Leave a Comment

Constructor & Destructor


1.   Khái niệm về constructor và destructor

a.Constructor
Constructors (được gọi là hàm tạo) là những hàm đặc biệt cho phép thực thi, điều khiển chương trình ngay khi khởi tạo đối tượng. Trong C#, Constructors có tên giống như tên của Class và không có giá trị trả về.

     Ví dụ:


class Library
{
private int ibooktypes;
//Constructor
public Library() // Hàm tạo không đối số.
{
ibooktypes = 7;
}
public Library(int value)
          {
          ibooktypes = value;
          }
}


Ví dụ: Với dụ trên thì bạn có hai cách khởi tạo lớp Library thông qua một trong hai hàm tạo

  • Library lb1 = new Library(); // Hàm tạo không đối số;
  •  Library lb2 = new Library(100); // Hàm tạo được truyền vào với giá trị là 100, và nó sẽ được gán vào ibooktypes = 100;
Read More
// // Leave a Comment

Phương Thức Nạp Chồng - Overloading

 C# hỗ trợ phương thức nạp chồng với một vài dạng phương thức khác nhau về những đặc tính sau: tên, số lượng thông số, và kiểu thông số. Nhưng nó không hỗ trợ những thông số mặc định như C++ và VB. Một cách đơn giản là bạn khai báo những phương thức cùng tên nhưng khác số lượng và kiểu của thông số.

Method Overloading xuất hiện khi trong một class có từ hai hàm có cùng tên. Có hai kiểu Method Overloading:

  • Function Overloading dựa trên kiểu giá trị tham số truyền vào.
  • Function Overloading dựa trên số lượng tham số truyền vào.

Ví dụ


class Library
{
// Function Overloading
        public void insertbooks(int id)
        {
            //
        }
        public void insertbooks(int id, int type)
        {
            //
        }
        public void insertbooks(string id, int type)
        {
            //
  }
}


Ba hàm insertbooks ở trên là một ví dụ về function overloading trong lập trình C#. Trong khi hàm thứ nhất và thứ 2 là overloading theo số lượng tham số, và hàm thứ 3 với hàm thứ 2 là overloading theo kiểu tham số truyền vào.

Read More

Thứ Năm, 15 tháng 4, 2010

// // Leave a Comment

Lớp và đối tượng

1.    Lớp và đối tượng


a.        Lớp (class)


      Một lớp là một khái niệm mô tả cho những thực thể có chung tính chất và hành vi. Lớp định nghĩa những thuộc tính và hành vi được dùng cho những đối tượng của lớp đó. Do đó có thể nói lớp là một khuôn mẫu cho các đối tượng.


Công thức để tạo một class

AccessModifier  class className
{
      // thân class
}

Ví dụ tôi định nghĩa một class là color, class này được truy cập public
public class Color
{
    // Nội dung class

}

b.         Đối tượng

Đối tượng là một đại diện, hay có thể nói là một sản phẩm của một class. Tất cả các đối tượng đều có chung những thuộc tính và hành vi mà class định nghĩa. Cách tạo đối tượng giống như cách tạo một biến có kiểu dữ liệu là Class.

Ví dụ tôi muốn khai báo một đối tượng c là thể hiện của class color nói trên. Tôi làm như sau:

       Color c = new Color();
Sau đó từ đối tượng c này tôi sẽ truy cập đến các thành phần của class thông qua toán tử “.” (Mà tôi đã giới thiệu ở bài học số 2). Tuy nhiên việc truy cập các thành phần của class còn tùy thuộc vào thành phần đó là instance hay static. Bạn sẽ được tìm hiểu khái niệm này ở phần tiếp theo của bài học.

c.         Ưu điểm khi sử dụng lớp và đối tượng trong lập trình

Có một số những ưu điểm của việc sử dụng Class và đối tượng trong phát triển phần mềm. Những ưu điểm nổi bật nhất được liệt kê như sau:

§         Duy trì code bằng việc mô hình hóa
§         Đóng gói những sự phức tạp trong mã lênh từ người dùng
§         Khả năng sử dụng lại
§         Cung cấp đơn kế thừa để thực thi nhiều phương thức.
Các bạn sẽ hiểu hơn về điều này ở các bài học sau của chúng tôi về inheritance (sự thừa kế) hay polymorphism ( Tính đa hình ).

Read More