2013-10-08 13 views
8

これが可能かどうかわかりませんが、派生クラスからベースクラスインスタンスを取得しようとしています。 C#ではベースキーワードを使用してベースクラスのプロパティとメソッドにアクセスできますが、ベースを使用したいと思います。そうしようとすると、"キーワード 'base'の使用はこのコンテキストでは無効です"エラー。派生クラスからベースクラスインスタンスを取得する方法

サンプルコード

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

コードスニペットは1000語に相当します。 – ppeterka

+0

あなたのコードを私たちに示すことができますか、私はあなたがしていることをかなり理解できません。ありがとうございます。 –

+1

@TimSchmelter OPはそれについて知っていますが、彼が何を望んでいるのかはっきりしていません。おそらく、 "return base;"(http://stackoverflow.com/questions/14482799/return-base-class -in-c-sharp) – ppeterka

答えて

14

あなたが派生クラスのインスタンスで作業している場合、base instanceはありません。 例:

B内で可能ではありません何
class A 
{ 
    public void Foo() { ... } 
} 

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

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

あなたはこのような何か行うことができます。

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

をそして、あなたは

public A GetBase() 
{ 
    return (A)this; 
} 
のような別のメソッドを追加することができます

そして、あなたができる

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

だから、これGetBase()方法は、あなたが望むものと考えられます。

パンチラインは次のとおりです。あなたがBのインスタンスを持っている場合、それはすべてのプロパティとAの非オーバーライド動作を継承しますが、それはへの(隠されたが、自動)の参照を保持するBのインスタンスで構成されていませんAのインスタンス。 BインスタンスをAにキャストできますが、そのインスタンスはBのままです。

0

問題はそれができたとしてはっきりと説明されていません。ただし、通常、抽象基本クラスとメソッドを使用し、必要なメソッドをオーバーライドする方がよい場合があります。この場合、必要に応じてbase.methodを使用できます(そうしないと、派生クラスのインスタンスをスピンアップするだけです)。

public abstract class foo { 

    public virtual void bar(){..} 
} 

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

}

0

派生インスタンスはベースインスタンスです。これはメモリ内のオブジェクトインスタンスの1つです。

例:

public class A : B 
{ 
} 

var thing = new A(); 

thingAのインスタンスであり、またBのインスタンスです。あなたは、たとえば、この行を書くことができ

B thing2 = thing;

3

さてあなたは、あなたの質問のためのコードを提供していないが、私はあなたが

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

のような何かをしたい。しかしMyBaseが本当にのであることに留意してくださいsupsectタイプDerived

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

ポイント1:子クラス内でベースクラスインスタンスを作成したい場合は、no価値がある。あなたはすでに子供の中で公共のものにアクセスできます。

ポイント2:初期化された子クラスがあり、今は基底クラス "インスタンス"を取得したい場合、初期化されていない場合はどのように取得できますか?(ベースクラスインスタンスは物理メモリに存在しないためそこに子クラスのインスタンスがありますか?)

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

で更新しても、コードがどれほど良いかどうかにかかわらず、これはいくつかの**明確で詳細な説明なしでは質問に答えません**。 – Enigmativity

関連する問題