繁体   English   中英

如何访问抽象父类的实例成员?

[英]How to access instance members of an abstract parent class?

如果无法创建父类(抽象)的实例,我们如何访问子类中抽象父类的实例成员?

TL:RD; 答案是肯定的。 但是它们不会被复制。

比方说:

public abstract class A
{
    public string Code { get;set; }
}

是您的超级(父/母)类,并且

public class B : A
{
    public string Title { get;set; }
}

是您的派生(子)类。 类B的实例将包含属性Code和Title。

B类扩展了A类。这使得通过简单地将B类的实例强制转换为A类成为可能。

B foo = new B();
A bar = foo as A;

尽管我建议您使用接口而不是超类来检查实例是否具有您要查找的特定属性。

同样,A类的属性和方法不会复制到B类。B类将其方法和属性扩展到A类。

-编辑-

要回答这个问题:两个构造函数都被调用了,那么实际上不是2个不同的对象吗?

在编译器级别,是的,抽象类和派生类是2个不同的对象。 但是,作为实例B的用户,您不必担心B实际上是由B和A组成的对象。

在上面的示例中,如果将B强制转换为A。然后修改属性“代码”。 然后将对象转换回B。“代码”属性仍设置为新值。

例:

B foo = new B();
foo.Code = "testfoo";
Console.WriteLine(foo.Code); //output will be testfoo;

A bar = foo as A;
bar.Code = "testbar";
Console.WriteLine(bar.Code); //output will be testbar;

但是也:

Console.WriteLine(foo.Code); //output will be testbar;

这是因为派生类B实际上不包含属性Code。 它只说它扩展了A,并且A具有属性Code。

但! 如果使用new(vb.net中的阴影),您的疑问将是合理的。

例:

public abstract class A
{
    public string Code { get;set; }
}

public class B : A
{
    public new string Code { get;set; }
    public string Title { get;set; }
}

然后发生的就是我认为您担心发生的事情。

现在,派生类和超类都具有属性“ Code”。

在此示例中,输出实际上将根据您如何看待对象而有所不同。

在这种情况下,确实会发生一些奇怪的事情,如果使用不当,很容易出错。

例:

B foo = new B();
foo.Code = "testfoo";
Console.WriteLine(foo.Code); //output will be testfoo;

A bar = foo as A;
bar.Code = "testbar";
Console.WriteLine(bar.Code); //output will be testbar;

但现在 :

Console.WriteLine(foo.Code); //output will be testfoo;

同样,术语抽象对您的类没有更多的作用,除了指出不能单独构造它,还必须继承它才能构造它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM