我不知道这是否可行,但我试图从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;
}
}
}
答案 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();
thing
是A
的实例,也是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));
}
结果是一个新对象,其中填充了子类的基类属性。