2016-05-27 22 views
6

genel özet sınıfında bir alan "ID" olmalıdır Nasıl Tanımlanmalıdır Genel bir sınıf oluşturmaya çalışıyorum, bu bana kaydetme/silme Müşteriler, Ürünler, böylece tüm sahip olabileceğim tek bir yerde temel uygulama.Tip T, C#

public interface ISomeInterface 
{ 
    int Id { get; } 
} 

Ve i bir alan Id ile bir arayüz ISomeInterface tanımla Item.Id <= 0

+0

Nasıl, ItemDataService sınıfında müşteri sınıfı ıd özelliği erişebilirsiniz (Item.Id <= 0) OP için – Raj

cevap

6

kontrol edebilmesi

public class Product : ItemDataService<Product> 
{ 
public int id {get; set;} 
} 

public class Customer : ItemDataService<Customer> 
{ 
public int id {get; set;} 
} 

public abstract class ItemDataService<T, V> 
{ 
public T Item { get; set; } 

public int Id { get; set; } 

public ItemDataService(T item) 
{ 
    Item = item; 
} 

public void SaveItem(T item) 
{ 
    if (Item.Id <= 0) 
    { 
     InsertItem(item); 
    } 
} 
} 

Nasıl gibi, ItemDataService sınıfta customer sınıfının Id özelliğine erişebilir daha sonra, soyut sınıfınızı bu arabirimi uygulayabilir ve ayrıca, T'u gerektiren bir genel kısıtlama da ekleyebilirsiniz. Böyle terface:

public abstract class ItemDataService<T> : ISomeInterface 
    where T : ISomeInterface 
{ 
    public int Id { get; set; } 

    // ... 

    public void SaveItem(T item) 
    { 
     if (Item.Id <= 0) // Id is accessible now.. 
     { 
      InsertItem(item); 
     } 
    } 
} 

DÜZENLEME Aslında

, sizin ilginç kalıtım ağacı verilen, hiç bir arayüze gerek yoktur. ItemDataService<T> numaralı bir çocuk olmak için T'u zorlayan genel bir kısıtlama ekleyebilirsiniz. Komik görünüyor, ama çalışır: i kontrol edebilirsiniz böylece

public abstract class ItemDataService<T> 
    where T : ItemDataService<T> 
{ 
    public int Id { get; set; } 

    // ... 

    public void SaveItem(T item) 
    { 
     if (Item.Id <= 0) // Id is accessible now.. 
     { 
      InsertItem(item); 
     } 
    } 
} 
+1

, hissetmiyorum Kalıtım ağacını "İlginç" olarak adlandırdığı gerçeğini söylemesi, yaptıklarının resmi adıdır. "[Merakla yinelenen şablon kalıbı] (https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern)". –

+0

Teşekkürler, Çalışır ... – Raj