Domanda

saluti. Ho la seguente classe:

public class Ship
{
    public enum ValidShips
    {
        Minesweeper,
        Cruiser,
        Destroyer,
        Submarine,
        AircraftCarrier
    }

    public enum ShipOrientation
    {
        North,
        East,
        South,
        West
    }

    public enum ShipStatus
    {
        Floating,
        Destroyed
    }

    public ValidShips shipType { get; set; }

    public ShipUnit[] shipUnit { get; set; }

    public ShipOrientation shipOrientation { get; set; }

    public ShipStatus shipStatus { get; set; }

    public Ship(ValidShips ShipType, int unitLength)
    {
        shipStatus = ShipStatus.Floating;

        shipType = ShipType;

        shipUnit = new ShipUnit[unitLength];

        for (int i = 0; i < unitLength; i++)
        {
            shipUnit[i] = new ShipUnit();
        }
    }
}

mi piacerebbe ereditare questa classe in questo modo:

public class ShipPlacementArray : Ship
{

}

questo ha un senso.

Quello che vorrei sapere è come faccio a rimuovere alcune funzionalità della classe di base?

Ad esempio:

    public ShipUnit[] shipUnit { get; set; } // from base class

Vorrei che fosse:

    public ShipUnit[][] shipUnit { get; set; } // in the derived class

la mia domanda è: come faccio a implementare il codice che nasconde completamente lo shipUnit classe di base?

altrimenti lo finire con due implementazione shipUnit nella classe derivata.

grazie per il vostro tempo.

ShipPlacementArray si occupa di una sola nave. ma la matrice riflette le direzioni la nave può essere messo a.

È stato utile?

Soluzione

Nella mia esperienza, ogni volta che ho voluto rimuovere una proprietà da una classe in una classe ereditata, il mio disegno classe era viziata. Un modo per risolvere questo problema sarebbe quello di creare una nuova classe di base senza la proprietà ShipUnit e poi ereditare la classe base di due volte, una per il tipo di nave di cemento e una volta per il vostro tipo ShipPlacementArray concreto. In entrambe le sottoclassi si potrebbe implementare ShipUnit come è necessario.

Altri suggerimenti

  

Quello che vorrei sapere è come faccio a rimuovere alcune funzionalità della classe di base?

Non lo sai. Questo non è il punto di eredità. Il punto di ereditarietà è di ereditare la funzionalità di classe di base - tutti di esso - e l'aggiunta / roba cambiando. E 'per "is-a" rapporti, ad esempio, "una macchina è una veicolo".

  

la mia domanda è: come faccio a implementare il codice che nasconde completamente lo shipUnit classe di base?

Sembra che si desidera ShipPlacementArray di essere un involucro, o contenitore di più oggetti Ship. Questo non sembra un caso in cui deve essere utilizzato eredità.

Ponetevi la domanda: "è una ShipPlacementArray una sorta di Ship"

Non è possibile fare i membri di una classe base sparire in una classe derivata. In alcuni casi, è possibile Maschera o nascondere gli elementi di base utilizzando la parola chiave new sul vostro membro nascosto nella classe derivata, ma l'utente sarà sempre in grado di lanciare l'oggetto torna alla (base)instance_of_derived classe base e accedere ai membri della classe base.

Quindi, per esempio, si può fare nella classe derivata:

public new ShipUnit[][] shipUnit { get; set; }

Ma poi posso fare:

((Ship)ShipPlacementArray_instance).shipUnit

E questo farà riferimento al shipUnit originale. Così, è possibile "nascondere" il membro, ma non è possibile disattivare la funzionalità o l'accessibilità.

Con C # 's nuovo modificatore si può nascondere un membro ereditato da un membro della classe di base. Scopri questa pagina per riferimento.

In additoin alle altre risposte eccellenti, come un a parte direi che si può trovare l'incapsulamento di essere una scelta migliore. Spesso ho usato per pensare in un primo momento ho voluto ereditare da una classe, e poi scoperto che volevo davvero per incapsulare esso. A tale scopo, è sufficiente dichiarare una nuova istanza della classe originale in un settore privato. È quindi creare proprietà pubbliche e la funzione che semplicemente chiamare la classe originale come il qui sotto, dando una grana fine di controllo su ciò che viene esposto. Questo è anche un modo all'altro passo gli svantaggi di ereditarietà come complessità e l'impossibilità di eseguire ereditarietà multipla (per una buona ragione):

class SomeNew
{
  private SomeOld someOld = new SomeOld();//could have done this in constructor instead

  public DoSomething()
  {
    someOld.DoSomething();
  }
}

Non so se questo è solo un esempio forzato, o un problema reale. Ma, direi che l'eredità in questo caso non si desideri. Hai Ship and ShipPlacementArray. Il "Array" alla fine fa sembrare più come il suo, così, un tipo di dati array. In modo da prendere che via, avete ShipPlacement.

Che suona per me come la sua una posizione da qualche parte, quindi forse dovrebbe essere un membro della classe Nave?

"Favorire la composizione di oggetti oltre la classe eredità" - Se siete alla ricerca di un nuovo comportamento dalla classe base, allora non sembra che ci si vuole ereditare comunque, perché sono diversi tipi. Forse Ship and ShipPlacementArray devono ereditare un'interfaccia comune, ma certamente non da una classe base comune. Ovunque avresti bisogno di utilizzare è possibile utilizzare l'interfaccia -. Ma dove avevi bisogno tua matrice ShipUnit, devi utilizzare il tipo di ShipPlacementArray esplicitamente

è possibile utilizzare l'operatore di "nuovo". come in

public new ShipUnit[][] shipUnit { get; set; } // in the derived class

È possibile utilizzare la parola chiave new, in questo modo:

public new ShipUnit[][] shipUnit { get; set; }

Io non comprendere appieno ciò che si vuole modellare con l'eredità, ma sono abbastanza sicuro che è lo strumento sbagliato. Presumo aggregazione o composizione sei quello che ti serve.

è possibile utilizzare la nuova parola chiave o aggiungere virtuale sulla dichiarazione sulla classe di base e sovrascrivere sulla classe derivata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top