MVP Award

OLYMPUS DIGITAL CAMERA          

Pada bulan July 2009 saya mendapatkan kado istimewa berupa award Microsoft MVP (Most Valuable Professional) untuk bidang keahlian Visual Basic (https://mvp.support.microsoft.com/profile/erick).

MVP adalah penghargaan yang diberikan oleh Microsoft kepada para profesional bidang teknologi informasi (TI) atas keahlian dan kontribusi mereka terhadap komunitas TI. Penghargaan MVP diberikan oleh Microsoft kepada individu yang tidak hanya memiliki keahlian pada satu atau beberapa produk Microsoft, tetapi juga memberikan kontribusi yang signifikan serta berperan aktif dalam komunitas, baik secara offline maupun online. 

Terima Kasih kepada Teman-teman di Microsoft Indonesia, Komunitas INDC (Indonesia Developer Community) dan MUGI (Microsoft User Group) yang telah banyak membantu saya sehingga saya dapat memperoleh penghargaan yang cukup bergengsi ini.

Membuat Paint App dengan C# dan GDI+ (Part 1)

Sesudah anda membaca tutorial saya yang sebelumnya tentang pemrograman GDI+ dengan C# Part 1 dan 2 maka pada kesempatan ini saya akan melanjutkannya dengan membuat sebuah contoh yang simple agar penerapan GDI+ menjadi lebih mudah untuk dimengerti

Pada tutorial kali ini saya akan mengajak anda untuk mencoba beberapa fitur yang ditawarkan oleh library GDI+ dan C# untuk membuat sebuah aplikasi pengolah citra yang sederhana (mirip aplikasi paint). Aplikasi ini juga saya gunakan sebagai tugas untuk mahasiswa yang mengambil matakuliah komputer grafis.

Untuk membuat aplikasi ini pertama-tama anda harus membuat design form sebagai berikut:

image 

kemudian deklarasikan beberapa variabel yang akan digunakan pada aplikasi ini

private Bitmap bitmap = null;
private Bitmap curBitmap = null;
private bool dragMode = false;
private bool boolFill = false;
private int drawIndex = 1;
private int curX, curY, x, y;
private int diffX, diffY;
private Graphics curGraphics;
public Pen curPen;
private SolidBrush curBrush;
private Size fullSize;

private Color borderColor = Color.Black;
private Color fillColor = Color.White;

private Image currImage = null;
private string currFilename = "";

pada saat form di load buat object Bitmap dan Graphic sebagai berikut,

private void Form1_Load(object sender, EventArgs e)
{
    //cek ukuran display monitor
    fullSize = SystemInformation.PrimaryMonitorMaximizedWindowSize;
    //buat object bitmap baru
    bitmap = new Bitmap(fullSize.Width,fullSize.Height);
    //buat object graphic baru
    curGraphics = Graphics.FromImage(bitmap);
    curPen = new Pen(Color.Black);
    curBrush = new SolidBrush(Color.Black);
}

pada saat event MouseDown pada form simpan titik (x,y)

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
    curX = e.X;
    curY = e.Y;
    dragMode = true;
}

pada saat event MouseMove, hitung height dan width dari titik awak ke titik akhir

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
    x = e.X;
    y = e.Y;
    //hitung beda antara titik awal dan akhir(pada saat move)
    diffX = e.X - curX;
    diffY = e.Y - curY;

    if (dragMode)
    {
        this.Refresh();
    }
}

Pada saat event MouseUp gambar dulu objectnya (rectangle, pen, atau, ellipse). Penggambaran object ini bukan di form melainkan pada object Graphic yang akan digunakan sebagai background agar setelah digambar object gambar yang lama tidak hilang.

private void Form1_MouseUp(object sender, MouseEventArgs e)
{
    diffX = x - curX;
    diffY = y - curY;

    switch (drawIndex)
    {
        case 1:
            //gambar garis
            curGraphics.DrawLine(curPen, curX, curY, x, y);
            break;
        case 2:
            //gambar ellipse
                curGraphics.DrawEllipse(curPen, curX, curY, diffX, diffY);
            break;
        case 3:
            //gambar kotak
                curGraphics.DrawRectangle(curPen, curX, curY, diffX, diffY);
            break;
    }

    RefreshFormBackground();
    dragMode = false;
}

Pada event Paint di form gambar objecnya

private void Form1_Paint(object sender, PaintEventArgs e)
{
    Graphics g = e.Graphics;

    if (currImage != null)
    {
        g.DrawImage(currImage, AutoScrollPosition.X, AutoScrollPosition.Y+pnlMenu.Height, currImage.Width, currImage.Height);
        curGraphics.DrawImage(currImage, AutoScrollPosition.X, AutoScrollPosition.Y+pnlMenu.Height, currImage.Width, currImage.Height);
        RefreshFormBackground();
        currImage = null;
    }

    if (dragMode)
    {
        switch (drawIndex)
        {
            case 1:
                //gambar garis
                g.DrawLine(curPen, curX, curY, x, y);
                break;
            case 2:
                //gambar ellipse
                    g.DrawEllipse(curPen, curX, curY, diffX, diffY);
                break;
            case 3:
                //gambar kotak
                    g.DrawRectangle(curPen, curX, curY, diffX, diffY);
                break;
        }
    }
}

method RefreshFormBackground() digunakan untuk menjadikan object curGraphic sebagai background form

private void RefreshFormBackground()
{
    curBitmap = bitmap.Clone(new Rectangle(0, 0, this.Width, this.Height), bitmap.PixelFormat);
    this.BackgroundImage = curBitmap;
}

setelah itu coba anda jalankan programnya dan mencoba menggambar object line atau rectangle sebagai berikut

image

untuk menambahkan pewarnaan fiil, border, open, dan save file akan dibahas di artikel selanjutnya, selamat mencoba

have fun guys.. coding is fun :)

Ditulis dalam C#. Tag: , , , , . 17 Komentar »

Pemrograman GDI+ dengan C# (Part 2)

Graphic Class Method

Draw Method

Digunakan untuk menggambar garis, rectangle, dan ellipse

Drawing Lines

Method DrawLine digunakan untuk menggambar garis yang menghubungkan dua titik.

 

Contoh2_4 Menggambar Garis

private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            Pen redPen = new Pen(Color.Red, 1);
            Pen bluePen = new Pen(Color.Blue, 2);
            Pen greenPen = new Pen(Color.Green, 3);
            Pen blackPen = new Pen(Color.Black, 4);
            // Draw line using float coordinates
            float x1 = 20.0F, y1 = 20.0F;
            float x2 = 200.0F, y2 = 20.0F;
            g.DrawLine(redPen, x1, y1, x2, y2);
            // Draw line using Point structure
            Point pt1 = new Point(20, 20);
            Point pt2 = new Point(20, 200);
            g.DrawLine(greenPen, pt1, pt2);
            // Draw line using PointF structure
            PointF ptf1 = new PointF(20.0F, 20.0F);
            PointF ptf2 = new PointF(200.0F, 200.0F);
            g.DrawLine(bluePen, ptf1, ptf2);
            // Draw line using integer coordinates
            int X1 = 60, Y1 = 40, X2 = 250, Y2 = 100;
            g.DrawLine(blackPen, X1, Y1, X2, Y2);
            // Dispose of objects
            redPen.Dispose();
            bluePen.Dispose();
            greenPen.Dispose();
            blackPen.Dispose();
        }

Contoh2_5 Menggambar Garis yang Terhubung

private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            Pen redPen = new Pen(Color.Red, 1);
            PointF[] ptsArray ={
                new PointF( 20.0F, 20.0F),
                new PointF( 20.0F, 200.0F),
                new PointF(200.0F, 200.0F),
                new PointF(20.0F, 20.0F)};
            g.DrawLines(redPen, ptsArray);
        }

Drawing Rectangle

Bentuk dasar selanjutnya adalah rectangle. Jika anda ingin menggambar rectangle maka yang harus diperhatikan adalah titik awal / starting point, width, dan height-nya.

Contoh2_6 Menggambar Rectangle

 

private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            // Create pens and points
            Pen redPen = new Pen(Color.Red, 1);
            Pen bluePen = new Pen(Color.Blue, 2);
            Pen greenPen = new Pen(Color.Green, 3);
            float x = 5.0F, y = 5.0F;
            float width = 100.0F;
            float height = 200.0F;
            // Create a rectangle
            Rectangle rect = new Rectangle(20, 20, 80, 40);
            // Draw rectangles
            g.DrawRectangle(bluePen,
              x, y, width, height);
            g.DrawRectangle(redPen,
              60, 80, 140, 50);
            g.DrawRectangle(greenPen, rect);
            // Dispose of objects
            redPen.Dispose();
            bluePen.Dispose();
            greenPen.Dispose();
        }

Contoh 2_7 Menggambar Rectangle Berurutan / Series Mode

private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            Pen greenPen = new Pen(Color.Green, 4);
            RectangleF[] rectArray =
            {
                new RectangleF( 5.0F, 5.0F, 100.0F, 200.0F),
                new RectangleF(20.0F, 20.0F, 80.0F, 40.0F),
                new RectangleF(60.0F, 80.0F, 140.0F, 50.0F)
            };
            g.DrawRectangles(greenPen, rectArray);
            greenPen.Dispose();
        }

Drawing Ellipses dan Circle

Bentuk ellipses adalah bentuk circular didalam bentuk rectangle. Bentuk ellipses mempunyai titik tengah / center point.

image

Contoh2_8 Menggambar Ellipses

 

private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            // Create pens
            Pen redPen = new Pen(Color.Red, 6);
            Pen bluePen = new Pen(Color.Blue, 4);
            Pen greenPen = new Pen(Color.Green, 2);
            // Create a rectangle
            Rectangle rect =
              new Rectangle(80, 80, 50, 50);
            // Draw ellipses
            g.DrawEllipse(greenPen,
              100.0F, 100.0F, 10.0F, 10.0F);
            g.DrawEllipse(redPen, rect);
            g.DrawEllipse(bluePen, 60, 60, 90, 90);
            g.DrawEllipse(greenPen,
              40.0F, 40.0F, 130.0F, 130.0F);
            // Dispose of objects
            redPen.Dispose();
            greenPen.Dispose();
            bluePen.Dispose();
        }

Drawing Text

Digunakan untuk menggambar text string dalam graphic surfaces

Contoh2_9 Menggambar String

private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            // Create brushes
            SolidBrush blueBrush = new SolidBrush(Color.Blue);
            SolidBrush redBrush = new SolidBrush(Color.Red);
            SolidBrush greenBrush = new SolidBrush(Color.Green);
            // Create a rectangle
            Rectangle rect = new Rectangle(20, 20, 200, 100);
            // The text to be drawn
            String drawString = "Hello GDI+ World!";
            // Create a Font object
            Font drawFont = new Font("Verdana", 14);
            float x = 100.0F;
            float y = 100.0F;
            // String format
            StringFormat drawFormat = new StringFormat();
            // Set string format flag to direction vertical,
            // which draws text vertically
            drawFormat.FormatFlags =
              StringFormatFlags.DirectionVertical;
            // Draw string

            g.DrawString("Drawing text",
              new Font("Tahoma", 14), greenBrush, rect);
            g.DrawString(drawString,
              new Font("Arial", 12), redBrush, 120, 140);
            g.DrawString(drawString, drawFont,
              blueBrush, x, y, drawFormat);
            // Dispose of objects
            blueBrush.Dispose();
            redBrush.Dispose();
            greenBrush.Dispose();
            drawFont.Dispose();
        }

Drawing Arc

Arc adalah bagian dari ellipse, yang dibentuk dari area rectangle, start angle, dan sweep angle. Cara penggunaan Arc adalah sebagai berikut:

Contoh2_11 Menggambar Arc

Buat design form sebagai berikut:

image

Buat variabel awal untuk deklarasi awal start dan sweep angle

private void Form1_Paint(object sender, PaintEventArgs e)
    {
        Graphics g = e.Graphics;
        Pen redPen = new Pen(Color.Red, 3);
        Rectangle rect = new Rectangle(20, 20, 200, 200);
        g.DrawArc(redPen, rect, startAngle, sweepAngle);
        redPen.Dispose();
    }
    private void btnReset_Click(object sender, EventArgs e)
    {
        startAngle =(float)Convert.ToDouble(txtStart.Text);
        sweepAngle =(float)Convert.ToDouble(txtSweep.Text);
        Invalidate();
    }

Drawing Curves

Curve terdiri dari dua macam yaitu open dan close curve

image

Contoh2_12 Drawing Curves

private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            // Create a pen
            Pen bluePen = new Pen(Color.Blue, 1);
            // Create an array of points
            PointF pt1 = new PointF(40.0F, 50.0F);
            PointF pt2 = new PointF(50.0F, 75.0F);
            PointF pt3 = new PointF(100.0F, 115.0F);
            PointF pt4 = new PointF(200.0F, 180.0F);
            PointF pt5 = new PointF(200.0F, 90.0F);
            PointF[] ptsArray =
            {
                pt1, pt2, pt3, pt4, pt5
            };
            // Draw curve
            g.DrawCurve(bluePen, ptsArray);
            // Dispose of object
            bluePen.Dispose();
        }

Contoh2_13 Drawing Curves dengan Tension

private float tension = 0.5F;

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            // Create a pen
            Pen bluePen = new Pen(Color.Blue, 1);
            // Create an array of points
            PointF pt1 = new PointF(40.0F, 50.0F);
            PointF pt2 = new PointF(50.0F, 75.0F);
            PointF pt3 = new PointF(100.0F, 115.0F);
            PointF pt4 = new PointF(200.0F, 180.0F);
            PointF pt5 = new PointF(200.0F, 90.0F);
            PointF[] ptsArray =
            {
                pt1, pt2, pt3, pt4, pt5
            };
            // Draw curve
            g.DrawCurve(bluePen, ptsArray,tension);
            // Dispose of object
            bluePen.Dispose();
        }

        private void btnApply_Click(object sender, EventArgs e)
        {
            tension = (float)Convert.ToDouble(txtTension.Text);
            Invalidate();
        }

Contoh2_14 Drawing Closed Curve

private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            // Create a pen
            Pen bluePen = new Pen(Color.Blue, 1);
            // Create an array of points
            PointF pt1 = new PointF(40.0F, 50.0F);
            PointF pt2 = new PointF(50.0F, 75.0F);
            PointF pt3 = new PointF(100.0F, 115.0F);
            PointF pt4 = new PointF(200.0F, 180.0F);
            PointF pt5 = new PointF(200.0F, 90.0F);
            PointF[] ptsArray =
            {
                pt1, pt2, pt3, pt4, pt5
            };
            // Draw curve
            g.DrawClosedCurve(bluePen, ptsArray);
            // Dispose of object
            bluePen.Dispose();
        }

Drawing Polygon

Polygon adalah bentuk yang terdiri dari tiga atau lebih garis, misal: segitiga, dan kotak.

Contoh2_15 Drawing Polygon

private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            // Create pens
            Pen greenPen = new Pen(Color.Green, 2);
            Pen redPen = new Pen(Color.Red, 2);
            // Create points for polygon
            PointF p1 = new PointF(40.0F, 50.0F);
            PointF p2 = new PointF(60.0F, 70.0F);
            PointF p3 = new PointF(80.0F, 34.0F);
            PointF p4 = new PointF(120.0F, 180.0F);
            PointF p5 = new PointF(200.0F, 150.0F);
            PointF[] ptsArray =
            {
                p1, p2, p3, p4, p5
            };
            // Draw polygon
            g.DrawPolygon(greenPen, ptsArray);
            // Dispose of objects
            greenPen.Dispose();
            redPen.Dispose();
        }

Drawing Graphic Path

Graphic Path menghubungkan beberapa objek drawing seperti line, rectable, circle, dll.

Contoh2_16 Drawing Graphic Path

using System.Drawing;
using System.Drawing.Drawing2D;

private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            // Create a pen
            Pen greenPen = new Pen(Color.Green, 1);
            // Create a graphics path
            GraphicsPath path = new GraphicsPath();
            // Add a line to the path
            path.AddLine(20, 20, 103, 80);
            // Add an ellipse to the path
            path.AddEllipse(100, 50, 100, 100);
            // Add three more lines
            path.AddLine(195, 80, 300, 80);
            path.AddLine(200, 100, 300, 100);
            path.AddLine(195, 120, 300, 120);
            // Create a rectangle and call
            // AddRectangle
            Rectangle rect =
              new Rectangle(50, 150, 300, 50);
            path.AddRectangle(rect);
            // Draw path
            g.DrawPath(greenPen, path);
            // Dispose of object
            greenPen.Dispose();
        }

Drawing Pie Shapes

image

Contoh2_17 Drawing Pie Chart

image

private void btnDraw_Click(object sender, EventArgs e)
        {
            // Create a Graphics object
            Graphics g = this.CreateGraphics();
            g.Clear(this.BackColor);
            // Get the current value of start and sweep
            // angles
            float startAngle =
              (float)Convert.ToDouble(textBox1.Text);
            float sweepAngle =
              (float)Convert.ToDouble(textBox2.Text);
            // Create a pen
            Pen bluePen = new Pen(Color.Blue, 1);
            // Draw pie
            g.DrawPie(bluePen, 20, 20, 100, 100,
              startAngle, sweepAngle);
            // Dispose of objects
            bluePen.Dispose();
            g.Dispose();
        }

 

bersambung Part 3…..

Ditulis dalam .NET Tech, C#. Tag: , , . Leave a Comment »

Object Oriented Programming in C# (Part4)

Pada Turtorial keempat ini akan dibahas beberapa topik yaitu:

  • Abstract Class
  • Sealed Class
  • “Object” akar dari semua class
  • Boxing dan Unboxing Types
  • Interfaces

Abstract Class

Setiap tipe Window pasti mempunyai bentuk tampilan yang berbeda misal combobox, listbox, button, dll. Berarti setiap class turunan dari Window harus mempunyai method DrawWindow() nya sendiri yang berbeda satu sama lain. Untuk memastikan bahwa setiap class turunan harus mempunyai method tertentu maka anda harus mendefinisikan class tersebut sebagai abstract class dan memiliki method abstract.

Abstract method tidak mempunyai implementation, abstract method hanya semacam kontrak yang harus dipenuhi. Semua class yang diturunkan dari class yang mempunyai abstract method harus mengimplementasikan method tersebut.

Class yang didefinisikan sebagai abstract class tidak dapat dibuat instan class / objek, class yang didefinisikan abstract hanya dapat digunakan dengan cara diturunkan.

   1: //mendeklarasikan abstract class
   2:     public abstract class Window
   3:     {
   4:         //konstruktor
   5:         public Window(int top, int left)
   6:         {
   7:             this.top = top;
   8:             this.left = left;
   9:         }
  10:
  11:         //method abstract
  12:         public abstract void DrawWindow();
  13:
  14:         protected int top;
  15:         protected int left;
  16:     }     // end class Window
  17:
  18:     // ListBox diturunkan dari Window
  19:     public class ListBox : Window
  20:     {
  21:         // konstruktor
  22:         public ListBox(int top, int left, string contents)
  23:             : base(top, left) // memanggil konstruktor dari base class
  24:         {
  25:             listBoxContents = contents;
  26:         }
  27:
  28:         //implementasi method abstract pada class anak
  29:         public override void DrawWindow()
  30:         {
  31:             Console.WriteLine("Writing string to the listbox: {0}",
  32:             listBoxContents);
  33:         }
  34:         private string listBoxContents; // member variable yang baru
  35:     }     // end class ListBox
  36:
  37:     public class Button : Window
  38:     {
  39:         public Button(
  40:         int top,
  41:         int left)
  42:             : base(top, left) { }
  43:
  44:         // implementasi abstract method
  45:         public override void DrawWindow()
  46:         {
  47:             Console.WriteLine("Drawing a button at {0}, {1}\n",
  48:             top, left);
  49:         }
  50:     }        // end class Button
  51:
  52:     public class Tester
  53:     {
  54:         static void Main()
  55:         {
  56:             Window[] winArray = new Window[3];
  57:             winArray[0] = new ListBox(1, 2, "First List Box");
  58:             winArray[1] = new ListBox(3, 4, "Second List Box");
  59:             winArray[2] = new Button(5, 6);
  60:
  61:             for (int i = 0; i < 3; i++)
  62:             {
  63:                 winArray[i].DrawWindow();
  64:             }     // end for loop
  65:         }        // end main
  66:     }           // end class Tester

Sealed Class

Ini merupakan kebalikan dari abstract class, jika sebuah class dideklarasikan sebagai sebagai sealed class maka class tersebut tidak dapat diturunkan.

Object Root dari semua class

Semua class dari semua type diturunkan dari satu class untama yaitu class object. Meskipun tidak dituliskan secara eksplisit namun pada dasarnya semua class diturunkan dari class object.

Beberapa method yang ada pada class object adalah:

image_thumb[8]

Method dari class yang ada diatas dapat dioverride oleh semua class karena pada dasarnya semua class diturunkan dari class object.

   1: public class Dog
   2:     {
   3:         private int weight;
   4:
   5:         // konstruktor
   6:         public Dog(int weight)
   7:         {
   8:             this.weight = weight;
   9:         }
  10:
  11:         // override dari Object.ToString
  12:         public override string ToString()
  13:         {
  14:             return weight.ToString();
  15:         }
  16:     }
  17:
  18:     public class Tester
  19:     {
  20:         static void Main()
  21:         {
  22:             int i = 5;
  23:             Console.WriteLine("The value of i is: {0}", i.ToString());
  24:
  25:             Dog milo = new Dog(62);
  26:             Console.WriteLine("My dog Milo weighs {0} pounds", milo);
  27:         }
  28:     }

Boxing dan Unboxing Types

Boxing dan Unboxing adalah suatu proses ketika suatu tipe data value (seperti int) di konversikan menjadi tipe reference / object. Istilah boxing berarti diubah menjadi object dan unboxing berarti dikembalikan lagi ke tipe data value.

Proses boxing dilakukan secara implisit jadi compiler otomatis akan melakukannya ketika kita mengisi nilai bertipe value kedalam variabel bertipe object.

image_thumb[9]

   1: int myIntegerValue = 5;
   2: object myObject = myIntegerValue; // cast to an object
   3: myObject.ToString();

Tidak seperti boxing, proses unboxing harus eksplisit. Ketika proses unbox kita harus tahu tipe data apa yang kita ingin konversikan dari tipe objek-nya.

image_thumb[10]

   1: int myIntegerVariable = 123;
   2:
   3: //Boxing
   4: object myObjectVariable = myIntegerVariable;
   5: Console.WriteLine( "myObjectVariable: {0}",
   6: myObjectVariable.ToString(  ) );
   7:
   8: // unboxing (harus explicit)
   9: int anotherIntegerVariable = (int)myObjectVariable;
  10: Console.WriteLine( "anotherIntegerVariable: {0}",
  11: anotherIntegerVariable );
  12:
  13: Output:
  14: myObjectVariable: 123
  15: anotherIntegerVariable: 123

Menghindari Boxing dengan Generic

Proses boxing dan unboxing mempengaruhi performa program, karena semua harus di boxing kedalam tipe object (misal: dalam penggunaan ArrayList). Pada C# 2.0 keatas sudah mendukung generic sehingga proses boxing dan unboxing dapat dihindari.

Interfaces

Jika anda ingin mendefinisikan tipe baru tetapi tidak ingin mengimplementasikan isinya secara langsung maka anda dapat menggunakan interfaces.

Pada dasarnya interface adalah sebuah kontrak, ketika anda mendesign interface seolah-olah anda mengatakan “jika anda ingin menggunakan fasilitas ini maka anda harus mengimplementasi method, dan property-nya”. Class yang menggunakan interface tersebut setuju dengan kontrak dan mengimplementasikan requirement yang ditentukan.

Perbedaan Interface dan Abstract Class

Programmer sering merasa bingung dalam mebedakan Interface dan Abstract Class. Beberapa perbedaannya adalah:

  • Cara penggunaan Abstract Class adalah diturunkan, sedangkan cara penggunaan Interface adalah diimplementasikan.
  • Pada C# lambang untuk menurunkan class dan menggunakan interfaces sama-sama menggunakan tanda “:” (titik dua). Tetapi untuk membedakan biasanya nama interface diawali dengan huruf I di depan misal: IEnumerable, IDisposable, dll.
  • Sebuah class hanya dapat diturunkan dari satu abstract class tapi dapat menggunakan lebih dari satu interfaces.
  • Method dan member variable pada abstract class boleh sudah ada isinya, sedangkan pada interfaces semua belum ada implementasinya.
  • Pada Abstract Class semua method / member variable yang abstract harus diimplementasikan di class turunannya.
  • Pada Interface semua member variable dan method harus diimplementasikan di class yang menggunakan interface tersebut.
  • Access Modifier pada method dan member variable di Interface secara implisit adalah public.
   1: //deklarasi interface
   2:     interface IStorable
   3:     {
   4:         void Read();
   5:         void Write(object obj);
   6:         int Status { get; set; }
   7:
   8:     }
   9:
  10:     public class Document : IStorable
  11:     {
  12:         // implementasi dari member variabel yang dideklarasikan di interface
  13:         private int status = 0;
  14:
  15:         public Document(string s)
  16:         {
  17:             Console.WriteLine("Creating document with: {0}", s);
  18:         }
  19:
  20:
  21:         //implementasi method yang ada pada interface
  22:         public void Read()
  23:         {
  24:             Console.WriteLine(
  25:             "Implementing the Read Method for IStorable");
  26:         }
  27:
  28:         public void Write(object o)
  29:         {
  30:             Console.WriteLine(
  31:             "Implementing the Write Method for IStorable");
  32:         }
  33:
  34:         public int Status
  35:         {
  36:             get { return status; }
  37:             set { status = value; }
  38:         }
  39:
  40:
  41:     }
  42:
  43:     class Tester
  44:     {
  45:         public void Run()
  46:         {
  47:             Document doc = new Document("Test Document");
  48:             doc.Status = -1;
  49:             doc.Read();
  50:             Console.WriteLine("Document Status: {0}", doc.Status);
  51:         }
  52:
  53:         static void Main()
  54:         {
  55:             Tester t = new Tester();
  56:             t.Run();
  57:         }
  58:     }
  59:
  60: Output:
  61: Creating document with: Test Document
  62: Implementing the Read Method for IStorable
  63: Document Status: -1

Mengimplementasikan lebih dari satu Interface

Pada C# sebuah class hanya dapat diturunkan dari sebuah class saja, tidak seperti bahasa C++ yang mendukung multipe inheritance. Tetapi untuk interface anda dapat tidak menggunakannya, menggunakan satu interface saja, atau menggunakan lebih dari satu interface.

   1: interface IStorable
   2:     {
   3:         void Read();
   4:         void Write(object obj);
   5:         int Status { get; set; }
   6:
   7:     }
   8:
   9:     // lebih dari satu interface
  10:     interface ICompressible
  11:     {
  12:         void Compress();
  13:         void Decompress();
  14:     }
  15:
  16:
  17:     public class Document : IStorable, ICompressible
  18:     {
  19:         private int status = 0;
  20:
  21:         public Document(string s)
  22:         {
  23:             Console.WriteLine("Creating document with: {0}", s);
  24:         }
  25:
  26:         #region IStorable
  27:
  28:         public void Read()
  29:         {
  30:             Console.WriteLine(
  31:             "Implementing the Read Method for IStorable");
  32:         }
  33:
  34:         public void Write(object o)
  35:         {
  36:             Console.WriteLine(
  37:             "Implementing the Write Method for IStorable");
  38:         }
  39:
  40:         public int Status
  41:         {
  42:             get { return status; }
  43:             set { status = value; }
  44:         }
  45:
  46:         #endregion     // IStorable
  47:
  48:         #region ICompressible
  49:
  50:         public void Compress()
  51:         {
  52:             Console.WriteLine("Implementing Compress");
  53:         }
  54:
  55:         public void Decompress()
  56:         {
  57:             Console.WriteLine("Implementing Decompress");
  58:         }
  59:
  60:         #endregion  // ICompressible
  61:     }
  62:
  63:
  64:     class Tester
  65:     {
  66:         public void Run()
  67:         {
  68:             Document doc = new Document("Test Document");
  69:             doc.Status = -1;
  70:             doc.Read();          // dipanggil dari method IStorable
  71:             doc.Compress();      // dipanggil dari method ICompressible
  72:             Console.WriteLine("Document Status: {0}", doc.Status);
  73:         }
  74:
  75:         static void Main()
  76:         {
  77:             Tester t = new Tester();
  78:             t.Run();
  79:         }
  80:     }
  81:
  82: Output:
  83: Creating document with: Test Document
  84: Implementing the Read Method for IStorable
  85: Implementing Compress
  86: Document Status: -1

pustaka: “Learning C# 2005″, Jesse Liberty, Brian MacDonald, O’Reilly 2006

Ditulis dalam .NET Tech, C#. Tag: , , . Leave a Comment »