Decidi il tipo di oggetto durante il runtime

1

Cerco di implementare un PriorityQueue con C #:

public class PriorityQueue<T> : Heap<T> where T : IComparable<T> {
    ...
}

L'heap è astratto. Ho MinHeap e MaxHeap derivati da Heap.

public abstract class Heap<T> where T : IComp ...
public class MinHeap<T> : Heap<T> ...
public class MaxHeap<T> : Heap<T> ...

Esiste la possibilità di decidere nel costruttore di PriorityQueue durante il runtime, se il PrioQueue diventa un MinHeap o MaxHeap? Come:

public PriorityQueue(bool type) {
    if (type = smallestFirst) { this = MinHeap ... }
    else { this = MaxHeap ... }
}

Se provo in questo modo, allora dice che "questo" è protetto da scrittura. Altre idee?

    
posta Sneedlewoods 19.10.2014 - 21:33
fonte

2 risposte

7

No, non è possibile.

Dovresti usare la composizione invece dell'eredità qui. Avere Heap<T> come campo e assegnare un'istanza specifica in questo campo.

public class PriorityQueue<T> where T : IComparable<T> {
    Heap<T> _heap;

    public PriorityQueue(bool type) {
        if (type == smallestFirst) { _heap = new MinHeap<T>(); }
        else { _heap = new MaxHeap<T>(); }
     }
}
    
risposta data 19.10.2014 - 21:37
fonte
1

Un'alternativa al suggerimento di Euphoric è di usare un metodo Factory piuttosto che chiamare direttamente il nuovo PriorityQueue, ovvero avere un metodo statico in PriorityQueue che decide quale sottotipo creare e quindi restituisce un'istanza del tipo appropriato.

    
risposta data 20.10.2014 - 11:08
fonte

Leggi altre domande sui tag