2013-06-11 20 views
12

BaseClass kullanarak eski kodum var ve kod, interieri int türünde olmasını bekliyor. Daha sonra BaseClass gibi davranan yeni bir sınıf olan DerivedClass'ı yaratma zorunluluğum var ama şimdi customerid'in bir string olması gerekiyor. Eski kod, testin gerekli olmaması için değiştirilemez.Aynı adı taşıyan bir özelliği kullanmanın bir yolu var mı, türetilmiş sınıfta farklı türde mi?

Kalıtım (veya başka bir yolla) kullanmak istediğiniz efekti nasıl alabilirim? Aşağıdaki Linqpad test kodunun ne yapmam gerektiğini gösterdiği

. DerivedClass'daki customerid'nin int olması gerektiğinden, bu durum derlenmeyecektir. Ben de customerid adında bir string özelliğine ihtiyacım var. Başka bir kod, bu sınıfı BaseClass yerine kullanacağından ve aynı adlandırılmış özelliği tür dizesinde olmasını beklediği için bu adın olması gerekir.

public class BaseClass 
{ 
    public virtual int customerid {get; set;} 

    public void printname() 
    { 
     customerid = 1; 
     customerid.Dump(); 
    } 
} 

public class DerivedClass : BaseClass 
{ 
    public new string customerid {get; set;} 

    public void PrintCustomerID() 
    { 
     customerid = "jshwedeX"; 
     customerid.Dump(); 
    } 
} 

Bu, istenen sonuçlar verecektir, ama aynı zamanda temel sınıf özelliği gizler:

public class BaseClass 
{ 
    public virtual int customerid {get; set;} 

    public void printname() 
    { 
     customerid = 1; 
     customerid.Dump(); 
    } 
} 

public class DerivedClass : BaseClass 
{ 
    public override string customerid {get; set;} 

    public void PrintCustomerID() 
    { 
     customerid = "jshwedeX"; 
     customerid.Dump(); 
    } 
} 



void Main() 
{ 
    DerivedClass dc = new DerivedClass(); 
    dc.printname(); 
} 
+3

: açık arabirim uygulamaları değişken arabirim türünde olmadıkça uygulanan üyeler görünmeyebilir neden olduğu

var instance = new Derived(); int id1 = ((IBase)instance).customerid; string id2 = ((IDerived)instance).customerid; 

unutmayın [Açık arayüz uygulaması] kullanabilir misiniz (http://msdn.microsoft.com/en-us/library/vstudio/ms173157.aspx)? – millimoose

+0

VB programcıları için, bir özellik, alan vb. Için yeni tanım oluştururken 'Gölgeler' anahtar sözcüğünü kullanın. Bu, dönüş değerleri bir uyumsuzluksa, bir ana türe aktarılırken dinamik programınızı etkileyebilir. – ps2goat

cevap

21

Böyle new düzenleyiciyi kullanabilirsiniz. DerivedClass'un bir örneğini BaseClass değişken olarak başvuruyorsanız, yalnızca temel sınıftaki özelliğe başvurabilirsiniz; türetilmiş sınıf değil. Başka bir deyişle

:

BaseClass instance = new DerivedClass(); 
string customerId = instance.customerid; // <- this won't compile 

alternatif açık arabirim uygulamaları kullanmak olacaktır: Derived sizin örnek türü IBase bir değişkende saklanır

public interface IBase 
{ 
    int customerid { get; set; } 
} 

public interface IDerived 
{ 
    string customerid { get; set; } 
} 

public class Derived : IBase, IDerived 
{ 
    int IBase.customerid { get; set; } 
    string IDerived.customerid { get; set; } 
} 

, customerid sonucuna varılır int sürümü ve IDerived türünde bir değişkende saklandığında, bu string sürümüne gider:

var derived = new Derived(); 
IBase ibase = derived; 
IDerived iderived = derived; 
int id1 = ibase.customerid; // <- compiles just fine 
string id2 = iderived.customerid; // <- compiles just fine 
Ayrıca dökümü kullanabilirsiniz

:

var instance = new Derived(); 
var customerid = instance.customerid; // <- this won't compile 
+1

+1, tabanın anlamını gizlemek için açık arabirimi tercih eder –

İlgili konular