2010-11-12 7 views
5

Sto estendendo alcuni dei tipi di dati di base in vb.net per una grande applicazione. Ciò include integer, string, short, ecc. Così com'è, i miei nuovi oggetti di tipo dati hanno nomi come MYInteger e MYString. Dal momento che questi sono gli unici tipi che uso per la mia applicazione e sono per lo più compatibili con i tipi predefiniti, c'è un modo per sovrascrivere i valori predefiniti con il mio, quindi quando stai usando il mio tipo intero leggermente personalizzato di Dim iThing as Integer?Come posso sovrascrivere i tipi di base come intero, stringa, ecc.?

+2

C'è un motivo per cui devi usare nuovi tipi primitivi? Perché non potresti usare i metodi di estensione? – cdhowie

+1

Penso che rompa quasi ogni regola di programmazione. Tuttavia, anch'io non penso sia possibile. Nel complesso, sembra un buon candidato per i metodi di estensione. – Inisheer

+2

Prima verifica se il programma di protezione dei testimoni dell'FBI è accessibile anche ai programmatori che hanno recentemente lasciato il lavoro. –

risposta

8

No. Se potessi, immagina il caos che causerebbe. Ci sarebbero due possibilità in questo scenario:

  1. Tutto il codice in esecuzione nello stesso processo avrebbe utilizzato quei tipi, anche il codice che non si aspetta di esso. Cattivo.

  2. Il concetto di Integer è diverso dal concetto CLR di uno Integer e improvvisamente due oggetti dello stesso tipo sono diversi. Cattivo.

È possibile aggiungere metodi di estensione per i tipi sigillati. Qualcosa di simile:

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

4.Extended() ' evaluates to 8 
1

Non sono sicuro che tu voglia davvero farlo. Lo renderà più difficile da mantenere in futuro. Perché non usare solo MyInteger, ecc. Se stai importando un codice sorgente esterno, basta fare una ricerca & sostituire.

+1

Avevo paura di non poterlo fare. È soprattutto perché il codice in questione verrà elaborato da un sacco di persone e abbiamo già avuto problemi con alcune persone che utilizzano numeri interi normali e alcuni che usano il tipo personalizzato e quindi un sacco di caos che ne derivano. Alcune funzioni sono scritte in modo da utilizzare l'impostazione predefinita e alcune l'abitudine e stavo cercando di semplificare le cose. – DynamiteReed

2

Non so se si applica nel tuo caso, ma a volte la gente vuole fare ciò che equivale a scalare "specializzata"/tipi primitivi.

Ad esempio, vedere alcuni dei tipi definiti in this codeplex project. Alcuni dei tipi includono latitudine, longitudine, dall'alto, ecc Ognuno di questi tipi è in realtà una struttura con un unico elemento di dati, di solito un doppio, float o int/lungo, come questo:

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); 
    } 
} 

Tecnicamente , questi tipi sono solo classi o strutture (principalmente le strutture nel caso del progetto collegato), ma sono usati per rappresentare valori che sono spesso (di solito? quasi sempre ??) semplicemente valori scalari. Se hai un oggetto che ha una proprietà Angle, la maggior parte delle persone probabilmente lo renderà doppio.

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

Quando un valore viene assegnato a AngleInDegrees, MyObject potrebbe desiderare di fare un po 'di elaborazione:

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

Che cosa succede se si ha una proprietà AngleInDegrees su molti oggetti? Cosa succede se hai una classe che consuma gli angoli prodotti da altri componenti nella tua applicazione? Chi dovrebbe fare la convalida? È utile poter contare sempre lavorando con angoli "buoni"?

Avendo un tipo AngleInDegrees, diventa possibile mettere tutte le operazioni di validazione e "Angolo" speciali nel tipo. Diventa anche possibile digitare fortemente tutti i luoghi in cui si desidera utilizzare AngleInDegrees.

Come ho detto, non so se questo è il tipo di cosa che stai cercando di raggiungere o meno. Mi è appena venuto in mente mentre leggevo la tua domanda che avevo lo stesso pensiero quando ho visto per la prima volta il progetto che ho collegato (ad es.sembrava che stessero, in effetti, sottoclasse i tipi di dati primitivi per creare tipi primitivi più restrittivi).