2013-10-08 19 views
8

Non so se è possibile, ma sto cercando di ottenere l'istanza di classe base da una classe derivata. In C#, posso usare la parola chiave di base per accedere alle proprietà e ai metodi della Classe Base (ovviamente), ma voglio usare base di base. Il tentativo di farlo risulta in un "L'utilizzo della parola chiave 'base' non è valido in questo contesto" Errore.Come ottenere un'istanza di classe base da una classe derivata

Esempio di codice

public class SuperParent 
{ 
    public int SPID; 

    public SuperParent() 
    { 
    } 
} 

public class SubChild : SuperParent 
{ 
    public SubChild(int pSPID) 
    { 
     base.SPID = pSPID; 
    } 

    public int BaseSPID 
    { 
     get 
     { 
      SuperParent sp = base; 
      return sp.SPID; 
     } 
    } 
} 
+7

Un frammento di codice vale 1000 parole. Si prega di fornire uno snippet di ciò che si desidera raggiungere – ppeterka

+0

Puoi mostrarci il tuo codice, non riesco a capire cosa stai cercando di fare, grazie. –

+1

@TimSchmelter OP lo sa, ma non è chiaro cosa vuole ... Forse qualcosa in linea come ["return base;"] (http://stackoverflow.com/questions/14482799/return-base-class -in-c-sharp) – ppeterka

risposta

14

Se si lavora con un'istanza della classe derivata, non c'è base instance. Un esempio:

class A 
{ 
    public void Foo() { ... } 
} 

class B : A 
{ 
    public void Bar() { ... } 
} 

Ciò che non è possibile all'interno B:

public void Bar() 
{ 
    // Use of keyword base not valid in this context 
    var baseOfThis = base; 
} 

si può fare qualcosa di simile:

public void Bar() 
{ 
    base.Foo(); 
} 

E si può aggiungere un altro metodo come

public A GetBase() 
{ 
    return (A)this; 
} 

E poi si può

public void Bar() 
{ 
    var baseOfThis = GetBase(); 
    // equal to: 
    baseOfThis = (A)this; 
} 

Quindi questo metodo GetBase() è probabilmente quello che volete.

La battuta finale è: Se si dispone di un'istanza di B, eredita tutte le proprietà e il comportamento non sovresposta di A, ma non consistere in un caso di B che detiene un (nascosto ma automatico) riferimento a un istanza di A. È possibile trasmettere l'istanza B a A, ma resta un'istanza di B.

0

il problema non è stato spiegato chiaramente come potrebbe. tuttavia, in genere, è preferibile utilizzare una classe base e metodi astratti e quindi sovrascrivere i metodi richiesti. puoi quindi utilizzare il metodo base.method come richiesto in questo caso (altrimenti avrai appena attivato un'istanza della classe derivata).

public abstract class foo { 

    public virtual void bar(){..} 
} 

public class footwo : foo { 
    public override void bar(){ 
     // do somethng else OR: 
     return base.bar(); 
    } 
} 

}

0

L'istanza derivata È l'istanza di base. È solo una istanza di oggetto in memoria.

esempio:

public class A : B 
{ 
} 

var thing = new A(); 

thing è un'istanza di un A, ed è anche un esempio di un B.
Si potrebbe, ad esempio, scrivere questa riga:
B thing2 = thing;

3

Beh non fornire il codice per la tua domanda, ma io supsect si desidera qualcosa di simile

class Base 
{ 
    public virtual void Foo() 
    { 
     Console.WriteLine("base"); 
    } 
} 

class Derived : Base 
{ 
    public override void Foo() 
    { 
     Console.WriteLine("derived"); 
    } 

    //// bad 
    //public Base MyBase 
    //{ 
    // get 
    // { 
    //  return base; // Use of keyword 'base' is not valid in this context 
    // } 
    //} 

    // work but... 
    public Base MyBase 
    { 
     get 
     { 
      return (Base)this; 
     } 
    } 
} 

Ma tenere a mente che MyBase è davvero di digitare Derived

new Derived().MyBase.Foo(); // output "derived" 
0

Punto 1: se si desidera creare l'istanza della classe base nella classe figlio di quanto non lo fa vale la pena. Hai già cose pubbliche accessibili in bambino.

Punto 2: Se è stata inizializzata la classe figlio e ora si desidera ottenere "istanza" della classe base, come è possibile ottenerla se non è inizializzata (Perché ora l'istanza della classe base non è presente nella memoria fisica, e lì è solo un'istanza di classe figlio lì)?

0
class Parent 
{ 
     private Parent _parent; 
     public Parent() 
     { 
     _parent = this; 
     } 

    protected Parent GetParent() 
    { 
     return _parent; 
    } 
} 

class Child : Parent 
{ 
    private Parent _parent; 
    public Child() 
    { 
     _parent = base.GetParent(); 
    } 
} 
+0

Indipendentemente dal livello di validità del codice, questo non risponde alla domanda senza alcuna ** spiegazione chiara e dettagliata **. – Enigmativity

Problemi correlati