15

我不知道这是否可能,但我正在尝试从派生类中获取基类实例。在 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;
        }
    }
}
4

7 回答 7

21

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

于 2013-10-08T08:53:39.660 回答
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"
于 2013-10-08T09:01:47.977 回答
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();
   }
}

}

于 2013-10-08T08:52:15.507 回答
0

第一点:如果你想在子类中创建基类实例,那就不值得了。您已经可以在孩子中访问公共事物。

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

于 2013-10-08T10:12:46.293 回答
0

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

例子:

public class A : B 
{
}

var thing = new A();

thing是 a 的一个实例,A也是 a 的一个实例B
例如,您可以编写以下行:
B thing2 = thing;

于 2013-10-08T08:55:30.637 回答
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));
}

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

于 2018-09-19T19:17:28.717 回答
-1
 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();
    }
}
于 2016-06-05T09:56:56.720 回答