2010-11-12 32 views
5

Büyük bir uygulama için, bca.net'deki temel veri türlerinden bazılarını genişletiyorum. Bu integer, string, short, vb içerir. Bu yana, yeni veri türü nesneleri MYInteger ve MYString gibi isimler var. Bunlar benim uygulama için kullanıyorum ve çoğunlukla varsayılan türleri ile uyumlu olan tek türler olduğundan, benim varsayılan değeri geçersiz kılmanın bir yolu var, bu yüzden Dim iThing as Integer aslında biraz özelleştirilmiş tamsayı türünü kullanıyorsunuz?Tamsayı, dizgi, vb. Gibi temel türleri nasıl geçersiz kılabilirim?

+2

Yeni ilkel türleri kullanmanız için bir nedeniniz var mı? Neden uzantı yöntemlerini kullanamazsınız? – cdhowie

+1

Sanırım her programlama kuralını kırıyor. Yine de, bunun mümkün olduğunu düşünmüyorum. Genel olarak, uzantı yöntemleri için iyi bir aday gibi geliyor. – Inisheer

+2

Öncelikle FBI'ın tanık koruma programının, işlerini kısa süre önce bırakan programcılara da erişip erişmediğini kontrol edin. –

cevap

8

Hayır. Eğer yapabilirseniz, o zaman neden olabilecek kaosun hayal edin. Bu senaryoya göre iki olasılık vardır olacaktır:

  1. bu tip, bunu beklemiyordum bile kodu kullanmak istiyorsunuz aynı işlemde çalışan tüm kodu. Kötü.

  2. Bir konseptiniz, CLR'nin Integer konseptinden farklıdır ve aniden iki tür aynı nesne farklıdır. Kötü.

Sen mühürlü türlerine uzatma yöntemleri ekleyebilirsiniz. Ama senin durumunda geçerlidir, ancak bazen insanlar "uzman" sayıl/ilkel türleri için ne miktarda yapmak istiyorsanız bilmiyorum

Module MyExtensions 
    <Extension()> 
    Public Function Extended(i as Integer) As Integer 
     return i + 4 
    End Function 
End Module 

4.Extended() ' evaluates to 8 
1

Bunu gerçekten yapmak isteyip istemediğinizden emin değilim. Gelecekte sürdürmeyi daha da zorlaştıracaktır. Neden sadece MyInteger kullanmıyorsunuz? Harici kaynak kodu ithal ediyorsanız, sadece & yerini bulun.

+1

Korkarım ki bunu yapamadım. Çoğunlukla, söz konusu kod çok sayıda insan üzerinde çalışılacak ve zaten normal tam sayıları kullanan bazı kişilerle ve bazılarının özel tipini kullanarak ve daha sonra bir sürü kaosla karşılaştıklarında sorun yaşadık. Bazı işlevler varsayılanı ve bazı özelleri kullanmak için yazılmıştır ve işleri basitleştirmek için uğraşıyordum. – DynamiteReed

2

: gibi bir şey. Örneğin, this codeplex project içinde tanımlanmış türlerden bazılarına bakın.

public struct Latitude : IFormattable, IComparable<Latitude>, IEquatable<Latitude> 
{ 
    private readonly double _DecimalDegrees; 

    //Some constants 

    //Some constructors 

    //Some static fields like... 
    public static readonly Latitude Equator = new Latitude(0.0); 
    public static readonly Latitude TropicOfCapricorn = new Latitude(-23.5); 
    public static readonly Latitude TropicOfCander = new Latitude(23.5); 

    //Some operators 
    public static Latitude operator +(Latitude left, Latitude right) 
    { 
    return new Latitude(left.DecimalDegrees + right.DecimalDegrees); 
    } 

    public static Latitude operator +(Latitude left, double right) 
    { 
    return new Latitude(left.DecimalDegrees + right); 
    } 
} 

Teknik olarak: türlerinin bazıları Bu tiplerin her biri bunun gibi,/uzun aslında genellikle tek bir veri üyesi, çift kişilik, şamandıra veya int bir yapı vb enlem, boylam, Angle içerir Bu türler sadece sınıf ya da yapılardır (esas olarak bağlantılı proje durumunda yapılar), fakat çoğunlukla (genellikle?, hemen hemen her zaman ??) olan değerleri temsil etmek için kullanılırlar. Eğer bir Angle özelliğine sahip bir nesneniz varsa, çoğu insan büyük olasılıkla bunu iki katına çıkaracaktır.

public MyObject 
{ 
    public double AngleInDegrees { set; get; } 
} 

bir değer AngleInDegrees atandığında, MyObject bazı işlem yapmak isteyebilirsiniz:

public double AngleInDegrees 
{ 
    get 
    { 
    return _AngleInDegrees; 
    } 
    set 
    { 
    if (value < 0 || value > 360) 
    { 
     _AngleInDegrees = NormalizeAngle(value); 
    } 
    else 
    { 
     _AngleInDegrees = value; 
    } 
    } 
} 

Ne birçok nesneler üzerinde bir AngleInDegrees özelliği olsaydı? Uygulamanızdaki diğer bileşenlerin ürettiği açıları tüketen bir sınıfınız varsa ne olur? Doğrulamayı kim yapmalıdır? Her zaman "iyi" açılarla çalışmayı hesaba katmak yararlı olur mu?

Bir AngleInDegrees türüne sahip olarak, tüm doğrulama ve özel "Açı" işlemlerini tür içine koymak mümkün hale gelir. Ayrıca AngleInDegrees kullanmak istediğiniz tüm yerleri güçlü bir şekilde yazmak mümkün olur.

Dediğim gibi, bunun başarmaya çalıştığınız şeyin türü olup olmadığını bilmiyorum. Ben sadece, bana bağlandığım projeyi ilk gördüğümde aynı düşünceye sahip olduğumu sorduğumda, bana öyle geliyordu (örn.Aslında, daha kısıtlayıcı ilkel türler yapmak için ilkel veri türlerinin alt sınıflarını oluşturdukları görülmüştür.

İlgili konular