如何从派生类获取基类实例

时间:2013-10-08 08:46:23

标签: c# .net inheritance derived-class base-class

我不知道这是否可行,但我试图从Derived Class中获取Base Class实例。在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;
        }
    }
}

7 个答案:

答案 0 :(得分:15)

如果您正在使用派生类的实例,则没有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的实例。

答案 1 :(得分:4)

嗯,你没有为你的问题提供代码,但我怀疑你想要像

这样的东西
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"

答案 2 :(得分: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();
   }
}

}

答案 3 :(得分:0)

派生实例是基本实例。它只是内存中的一个对象实例。

示例:

public class A : B 
{
}

var thing = new A();

thingA的实例,也是B的实例。
例如,您可以写下这一行:
B thing2 = thing;

答案 4 :(得分:0)

第1点:如果你想在子类中创建基类实例而不是它不值得。你已经有孩子可以访问的公共事物。

第2点:如果你已经初始化了子类,现在想要获得基类“实例”那么如果它没有被初始化你怎么能得到它(因为现在基类实例不存在于物理内存中,并且有只是子类实例那里)?

答案 5 :(得分: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();
    }
}

答案 6 :(得分:0)

我对他们的要求与此处的其他答案有所不同,所以我认为我愿意出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));
}

结果是一个新对象,其中填充了子类的基类属性。