Interfaceler ortak property ya da methodları tutan classlara benzer ama classlardan farklı olan yapılardır.
Diyelim ki iki class’ımız var örn Worker ve Customer bunların FirstName,LastName,Age,Address gibi birçok ortak özelliği vardır
Bu ortak özellikleri bir interfacede tutup bu classlara, interfacemizi implemente ederiz
Ya da SqlServerDAL ve OracleDAL isimli ortak methodları olan (ama method içerikleri farklı) iki classımız var
Biz bu ortak methodları yine bir imza şeklinde, Interface oluşturup orada tutar ve class’larımıza implemente ederiz
Daha sonra ana class’ımız olan CustomerDAL’a (CRUD işlemlerinin yapıldığı ana sınıf) ayrı ayrı SqlDAL, OracleDAL sınıflarını parametre olarak göndermek yer
Interfacelerini göndeririz
Bu bizim hem kod tekrarından kaçınmamızı hem gruplamamızı hem de açıklık sağlar yarın birgün MySQL’e veri eklemek istediğimizde diğer kodları hiç bozmadan MySQLDAL class’ını oluşturup, ICustomerDAL interface’ini implemente ederiz ve CustomerManagerDAL’a class’ımız otomatikmen parametre şekl. gönderilebilir
Main’de çağıracağımız zaman istenen Interface gibi görünür ama biz SQLServerDAL, OracleDAL ya da MySqlServerDAL nesnesini oluşturarak parametre olarak gönderebilliriz.
Yani interdacede temel amaç bağımlılıkları 0’a indirgemektir
Bir interface new’lenemez tek başına bir anlamı yoktur
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Interfaces
{
class Program
{
static void Main(string[] args)
{
/**
* Interfaceler ortak property ya da methodları tutan classlara benzer ama classlardan farklı olan yapılardır
* Diyelim ki iki class'ımız var örn Worker ve Customer bunların FirstName,LastName,Age,Address gibi birçok ortak özelliği vardır
* Bu ortak özellikleri bir interfacede tutup bu classlara, interfacemizi implemente ederiz
* Ya da SqlServerDAL ve OracleDAL isimli ortak methodları olan (ama method içerikleri farklı) iki classımız var
* Biz bu ortak methodları yine bir imza şeklinde, Interface oluşturup orada tutar ve class'larımıza implemente ederiz
* Daha sonra ana class'ımız olan CustomerDAL'a (CRUD işlemlerinin yapıldığı ana sınıf) ayrı ayrı SqlDAL, OracleDAL sınıflarını parametre olarak göndermek yerine Interfacelerini göndeririz
* Bu bizim hem kod tekrarından kaçınmamızı hem gruplamamızı hem de açıklık sağlar yarın birgün MySQL'e veri eklemek istediğimizde diğer kodları hiç bozmadan MySQLDAL class'ını oluşturup, ICustomerDAL interface'ini implemente ederiz ve CustomerManagerDAL'a class'ımız otomatikmen parametre şekl. gönderilebilir
* Main'de çağıracağımız zaman istenen Interface gibi görünür ama biz SQLServerDAL, OracleDAL ya da MySqlServerDAL nesnesini oluşturarak parametre olarak gönderebilliriz.
* Yani interdacede temel amaç bağımlılıkları 0'a indirgemektir
* Bir interface new'lenemez tek başına bir anlamı yoktur
*/
//InterfacesIntro();
CustomerManager customerManager = new CustomerManager();
customerManager.Add(new SqlServerCustomerDAL());
customerManager.Add(new OracleCustomerDAL());
//Sernayo: bizim bi verimiz var hem sql veritabanına hem de oracle veri tabanına yazmak istiyoruz
ICustomerDAL[] customerDALs = new ICustomerDAL[2] //ICustomerDAL türünde bir array tanımladık ve iki elemanlı olacak dedik
{
new SqlServerCustomerDAL(),
new OracleCustomerDAL()
};
foreach (var customerDAL in customerDALs)
{
customerDAL.Add();
}
Console.ReadLine();
}
private static void InterfacesIntro()
{
PersonManager manager = new PersonManager();
manager.Add(new Customer { Id = 1, FirstName = "Mehmet", LastName = "ICME", Address = "Kayseri" });
Customer customer2 = new Customer
{
Id = 2,
FirstName = "Burak",
LastName = "ICME",
Address = "İstanbuul"
};
manager.Add(customer2); //PersonManager'dan oluşturduğumuz manager nesnesindeki methodumuza customer nesnesini parametre olarak gönderdik
Student student = new Student()
{
Id = 1,
FirstName = "Ahmet",
LastName = "ÖZTÜRK",
Department = "Software Engineering"
};
manager.Add(student);
//Aynı methoda bu sefer student nesnesini gönderdik bunu yapmamızı sağlayan ikisininde IPerson Interface'inden implemente edilmiş olup methodtta parametre olarak person nesnesi istemiş olmamız
//Bu bize ne sağlar yarın birgün Worker nesnesi ekleyecek olursak direk IPersondan implemente edip kullanabilmemizi sağlar
manager.Add(new Worker { Id = 1, FirstName = "Elif", LastName = "Yıldırım", Department = "Math" });
}
}
interface IPerson //Bir interface oluşturduk ve iki farklı class'ımızda ortak olan property'leri bu interfacede tanımladık
{
int Id { get; set; }
string FirstName { get; set; }
string LastName { get; set; }
}
class Customer : IPerson //IPerson Interface'ni implemente ettik
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Address { get; set; }
}
class Student : IPerson //IPerson Interface'ni implemente ettik
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Department { get; set; }
}
class Worker : IPerson //IPerson Interface'ni implemente ettik
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Department { get; set; }
}
class PersonManager //Methodlarımızı tanımlayacağımız yeni bir class oluşturduk
{
//public void Add(Customer customer)
//{
// Console.WriteLine(customer.FirstName);
//}
//Methodumuzda IPerson interface'inden person nesnesini parametre olarak aldık dolayısıyla implemente ettiğimiz classların nesnelerini parametre olarak gönderebiliriz
public void Add(IPerson person)
{
Console.WriteLine(person.FirstName); //Ve bize bu persondan FirstName property'sini yazdırmasını istedik
}
}
}
ICustomerDAL.cs (Interface Dosyası)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Interfaces
{
//Diyelimki bizim hem mssql'le hem oracle ile çalışan bir sistemimiz var CRUD işlemlerini herbiri için ayrı ayrı yapmamız lazım.
//Ya da SQL ile bir proje yaptık fakat müşteri oracle kullanmak istediğini söyledi, oracle'a geçiş yaptı
//İşlemlerin imzaları (adları) ortak ama içerikleri farklı olduğu için ortak olan imzaları tutan bir Interface oluştururuz
//Sonra bu interface'yi Sql ve Oracle classlarına implemente ederiz
//Örneğin müşteri ekleme işlemi yapılacak bunun için CustomerManager diye ayrı bir class oluşturup ortak imzaları tutan ICustomerDAL Interface'ini parametre olarak veririz
//Bu sayede hiçbir bağımlılığımız olmadan imzaları ortak olan Sql ve Oracle CRUD methodlarını CustomerManager class'ından hiçbir bağımlılığımız olmadan çağırabiliriz
interface ICustomerDAL //DAL : Data Access Layer (CRUD işlemlerini burada yaparız)
{
void Add();
void Update();
void Delete();
}
class SqlServerCustomerDAL : ICustomerDAL
{
public void Add()
{
Console.WriteLine("Sql added");
}
public void Delete()
{
Console.WriteLine("Sql deleted");
}
public void Update()
{
Console.WriteLine("Sql updated");
}
}
class OracleCustomerDAL : ICustomerDAL
{
public void Add()
{
Console.WriteLine("Oracle added");
}
public void Delete()
{
Console.WriteLine("Oracle deleted");
}
public void Update()
{
Console.WriteLine("Oracle updated");
}
}
class CustomerManager
{
public void Add(ICustomerDAL customerDAL)
{
customerDAL.Add();
}
}
}

Yorum bırakın