7 Mart 2018

Interface Kullanımı Örneği

    Interface ortak özelliklere sahip olacak sınıflar için sahip olacağı özellikleri tanımlamak için kullanılır.
    IArea interface sahip olan classlar Base ve Height elemanlarıyla Area metoduna sahip olacaktır.
    Bu şekilde bu özellikler üzerinden yapılacak işlemleri class tan bağımsız yazabiliriz.
    Ve kod tekrarından kurtulmuş oluruz. Ayrıca bu fonksiyonlar kendi sınıfları içerisinde sınıfta yapması gereken işlemleri yapmış olur.
    Aşağıda ki örnekte Alan hesaplanabilir geometrik şekilleri IArea interface üzerinden tanımladık.
    Üçgenin alan formülü (taban x yükseklik) / 2
    Dikdörtgenin alan formülü (taban x yükseklik)
    Ama iki alanı toplamak için ikisinin de üçgen ya da dikdörtgen olması gibi bir zorunluluk yok
    Bu yüzden AreaExtensionMethods üzerinde IArea interface'ni parametre olarak kullanıp ikisinide işleme dahil ettik.
    Bu şekilde Dikdörtgen ve Üçgenin alanları toplamını elde edebiliyoruz.
    Dikkat edilirse burada artık tipin bir önemi yok. Ortak özellik üzerinden işlemlerimizi tamamlamış olduk.


 

using System;

namespace AbstractionDemo
{
    class Program
    {
        static void Main(string[] args)
        {

            IArea tr1 = new Triangle(10, 8);
            IArea tr2 = new Triangle(6, 10);
            IArea rc1 = new Rectangle(6, 4);
            IArea rc2 = new Rectangle(7, 8);

            Console.WriteLine($"Area tr1 :{tr1.Area()}");
            Console.WriteLine($"Area tr2 :{tr2.Area()}");
            Console.WriteLine($"Area rc1 :{rc1.Area()}");
            Console.WriteLine($"Area rc2 :{rc2.Area()}");

            Console.WriteLine($"Area tr1 + tr2 :{tr1.Add(tr2)}");
            Console.WriteLine($"Area tr1 + rc1 :{tr1.Add(rc1)}");
            Console.WriteLine($"Area rc1 + rc2 :{rc1.Add(rc2)}");
            Console.WriteLine($"Area rc2 + tr1 :{rc2.Add(tr1)}");

            /* ÇIKTI:
                Area tr1 :40
                Area tr2 :30
                Area rc1 :24
                Area rc2 :56
                Area tr1 + tr2 :70
                Area tr1 + rc1 :64
                Area rc1 + rc2 :80
                Area rc2 + tr1 :96
             
             */
        }
    }

    public static class AreaExtensionMethods
    {
        public static double Add(this IArea tobj, IArea obj) => tobj.Area() + obj.Area();

        public static double Extract(this IArea tobj, IArea obj) => tobj.Area() - obj.Area();
    }

    public interface IArea
    {
        int Base { get; set; }
        int Height { get; set; }
        double Area();
    }

    public class Triangle : IArea
    {
        public int Height { get; set; }

        public int Base { get; set; }

        public double Area() => (double)(Height * Base) / 2.0;

        public Triangle(int _base, int _height)
        {
            Height = _height;
            Base = _base;
        }
    }

    public class Rectangle : IArea
    {
        public int Height { get; set; }

        public int Base { get; set; }

        public double Area() => (double)(Height * Base);
        public Rectangle(int _base, int _height)
        {
            Height = _height;
            Base = _base;
        }
    }
}