请教个继承的问题

nnoovvee 2008-12-06 10:27:01
class A
{
protected void Apro()
{
Console.WriteLine("A_Protected");
}
protected static void Ast()
{
Console.WriteLine("A_Static");
}
}
class B : A
{
protected new static void Ast()
{
Console.WriteLine("B_Static");
}
static void Main(string[] args)
{
A.Ast(); //可以。和下面区别在哪?
B.Ast();
A a = new A();
a.APro(); //为什么这样不可以?
B b = new B();
b.Apro();
}
}
为什么子类中用父类实例不能访问实例方法?静态方法可以?protected修饰符不是在子类中可见么?
...全文
129 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
moluotuo 2008-12-06
  • 打赏
  • 举报
回复
因为静态成员是属于类的,而不是属于特定的某个对象,所以原则上不用对象访问
nnoovvee 2008-12-06
  • 打赏
  • 举报
回复
是不是静态方法都不用保护修饰符?
moluotuo 2008-12-06
  • 打赏
  • 举报
回复
在 A a = new A(); 中 a 是在静态的Main() 中生成的,不是类 B 的一个实例
故不符合“受保护成员在其所在的类中可由派生类实例访问”
yanrabbit163 2008-12-06
  • 打赏
  • 举报
回复
至于
A.Ast();和a.APro()的区别在于Main()和Ast()是静态的
TimLeaf 2008-12-06
  • 打赏
  • 举报
回复
A a = new A();
a.APro(); //为什么这样不可以?
这一句话是创建了A的对象a 而这个A不是A的派生类...而是A的本身...
我的理解是这样的~

看了个msdn的例子:

protected 关键字是一个成员访问修饰符。从声明受保护的成员的类中,以及从声明受保护的成员的类派生的任何类中都可以访问该成员。

仅当访问通过派生类类型发生时,基类的受保护成员在派生类中才是可访问的。例如,请看以下代码段:

class A
{
protected int x = 123;
}

class B : A
{
void F()
{
A a = new A();
B b = new B();
a.x = 10; // Error
b.x = 10; // OK
}
}
语句 a.x =10 将生成错误,因为 A 不是从 B 派生的。

结构成员无法受保护,因为无法继承结构。

对于不是从受保护的成员的类派生的类,引用其中受保护的成员是错误的。

有关受保护的成员的更多信息,请参见 3.5.3 实例成员的受保护访问。

有关 protected 与其他访问修饰符的比较,请参见可访问性级别。

示例
在此示例中,类 MyDerivedC 从 MyClass 派生;因此,可以从该派生类直接访问基类的受保护成员。

// protected_keyword.cs
using System;
class MyClass
{
protected int x;
protected int y;
}

class MyDerivedC: MyClass
{
public static void Main()
{
MyDerivedC mC = new MyDerivedC();

// Direct access to protected members:
mC.x = 10;
mC.y = 15;
Console.WriteLine("x = {0}, y = {1}", mC.x, mC.y);
}
}
输出
x = 10, y = 15
yanrabbit163 2008-12-06
  • 打赏
  • 举报
回复
a.APro(); //受保护(proected)的方法只能在该类或者该类子类的成员函数中被调用.这里不能调用的,注意红色的标记
nnoovvee 2008-12-06
  • 打赏
  • 举报
回复
是这两个的区别是什么?()
A.Ast(); //受保护(proected)的方法只能在该类或者该类子类的成员函数中被调用 。可以。和下面区别在哪?

A a = new A();
a.APro(); //受保护(proected)的方法只能在该类或者该类子类的成员函数中被调用 。为什么这样不可以?

bloodish 2008-12-06
  • 打赏
  • 举报
回复
A.Ast(); //可以。和下面区别在哪?
B.Ast();

你在B类里通过new关键字隐藏了A类的静态方法Ast,所以两者将各自调用各自类中定义的静态方法.
A a = new A();
a.APro(); //为什么这样不可以?

受保护(proected)的方法只能在该类或者该类子类的成员函数中被调用

B b = new B();
b.Apro();

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧