web-dev-qa-db-ja.com

派生クラスから基本クラスインスタンスを取得する方法

これが可能かどうかはわかりませんが、派生クラスから基本クラスインスタンスを取得しようとしています。 C#では、baseキーワードを使用して(もちろん)基本クラスのプロパティとメソッドにアクセスできますが、base自体を使用したいと思います。これを実行しようとすると、「キーワード '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;
        }
    }
}
13
OneSource

派生クラスのインスタンスを使用している場合、_base instance_はありません。例:

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

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

B内では不可能なこと:

_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のインスタンスのままです。

17
Matten

さてあなたはあなたの質問にコードを提供していませんが、私はあなたが次のようなものを望んでいると思います

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は実際にはDerivedタイプであることに注意してください

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

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

ポイント2:子クラスを初期化し、基本クラスの「インスタンス」を取得したい場合、初期化されていない場合はどうすれば取得できますか(基本クラスインスタンスが物理メモリに存在せず、子クラスしかないためインスタンスがあります)?

0
ataurrehman
 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
Subin Ninan

問題は、可能な限り明確に説明されていません。ただし、通常は、抽象基本クラスとメソッドを使用してから、必要なメソッドをオーバーライドする方が適切な場合があります。この場合、必要に応じて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
jim tollan

私は彼らが求めていることをここでの他の答えとは少し異なって解釈したので、私の$ 0.02を提供すると思いました。

// Create a "Parent" class that has some attributes.
public class Parent
{
    public string attribute_one { get; set; }
    public string attribute_two { get; set; }
    public string attribute_three { get; set; }
}

// Define a class called "Child" that inherits the
// attributes of the "Parent" class.
public class Child : Parent
{
    public string attribute_four { get; set; }
    public string attribute_five { get; set; }
    public string attribute_six { get; set; }
}

// Create a new instance of the "Child" class with
// all attributes of the base and derived classes.
Child child = new Child {
    attribute_one = "interesting";
    attribute_two = "strings";
    attribute_three = "to";
    attribute_four = "put";
    attribute_five = "all";
    attribute_six = "together";
};

// Create an instance of the base class that we will
// populate with the derived class attributes.
Parent parent = new Parent();

// Using reflection we are able to get the attributes
// of the base class from the existing derived class.
foreach(PropertyInfo property in child.GetType().BaseType.GetProperties())
{
    // Set the values in the base class using the ones
    // that were set in the derived class above.
    property.SetValue(parent, property.GetValue(child));
}

結果は、子クラスの基本クラスプロパティが入力された新しいオブジェクトです。

0
BBQ Singular

派生インスタンスIS基本インスタンス。メモリ内の単なる1つのオブジェクトインスタンスです。

例:

public class A : B 
{
}

var thing = new A();

thingAのインスタンスであり、Bのインスタンスでもあります。
たとえば、次の行を書くことができます:
B thing2 = thing;

0
Caleb