2013-10-08 32 views
8

Nie wiem, czy jest to możliwe, ale próbuję pobrać klasę podstawową z klasy pochodnej. W języku C# mogę użyć słowa kluczowego base, aby uzyskać dostęp do właściwości i metod klasy bazowej (oczywiście), ale chcę użyć samej bazy. Próba wykonania tego powoduje, że "Użycie słowa kluczowego" baza "jest nieprawidłowe w tym kontekście"błąd.Jak uzyskać klasę podstawową z klasy pochodnej

Przykładowy kod

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

Fragment kodu jest warty 1000 słów. Podaj fragment tego, co chcesz osiągnąć. – ppeterka

+0

Czy możesz pokazać nam swój kod, nie jestem w stanie dokładnie zrozumieć, co próbujesz zrobić, dzięki. –

+1

@ TimSchmelter OP o tym wie, ale nie jest jasne, czego chce ... Może coś takiego jak "baza powrotu" (http://stackoverflow.com/questions/14482799/return-base-class -in-c-sharp) – ppeterka

Odpowiedz

14

Jeśli pracujesz z instancją klasy pochodnej, nie ma base instance. Przykład:

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

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

co nie jest możliwe w ciągu B:

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

można zrobić coś takiego:

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

i można dodać inną metodę jak

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

a następnie można

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

więc ta metoda GetBase() jest prawdopodobnie co chcesz.

punchline brzmi: Jeśli masz instancję B, dziedziczy wszystkie właściwości i nie nadpisane zachowanie A, ale to nie składa się z instancją B który posiada (ukryty ale automatyczny) odniesienie do wystąpienie A. Możesz rzucić instancję do A, ale pozostanie instancją B.

0

problem nie został wyjaśniony tak wyraźnie, jak to potrafił. jednak zazwyczaj lepiej jest użyć abstrakcyjnej klasy bazowej i metod, a następnie zastąpić wymagane metody. możesz wtedy użyć metody base.method zgodnie z wymaganiami w tym przypadku (w przeciwnym razie po prostu obrócisz instancję klasy pochodnej).

public abstract class foo { 

    public virtual void bar(){..} 
} 

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

}

0

Instancja pochodna JEST instancją podstawową. To tylko jedna instancja obiektu w pamięci.

przykład:

public class A : B 
{ 
} 

var thing = new A(); 

thing jest wystąpienie A i jest również wystąpienie B.
Można by na przykład napisać ten wiersz:
B thing2 = thing;

3

No nie dostarczenie kodu za pytanie, ale supsect chcesz coś podobnego

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

Należy jednak pamiętać, że MyBase jest naprawdę wpisz Derived

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

Punkt 1: jeśli chcesz utworzyć instancję klasy bazowej w klasie dziecka niż nie robi t warto. Masz już dostęp do rzeczy publicznych dostępnych w dziecku.

Punkt 2: Jeśli zainicjalizowano klasę potomną, a teraz chcemy uzyskać klasę podstawową "instancja", to w jaki sposób można ją uzyskać, jeśli nie została zainicjowana (ponieważ teraz instancja klasy bazowej nie jest obecna w pamięci fizycznej, a tam jest tylko instancją klasy potomnej)?

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

Bez względu na to, jak dobry może być twój kod, nie jest to odpowiedź bez ** jasnego i szczegółowego wyjaśnienia **. – Enigmativity