我是csharp的新手,我发现如果我在子类中使用protected
关键字,那么它只能在不在父类中的子内部访问。此类变量或函数只能在子类中访问。
我正在阅读this的教程。
但是,如果我从Access类做inherit
,必须假设没有给出任何类型的错误,但我得到它。你能告诉我这里有什么问题吗?
这是我的代码:
using System;
class Access
{
//here string is declared as protected ..
protected string name;
public void print()
{
Console.WriteLine("MY name is: {0}", name);
}
}
class MyProgram: Access
{
static void Main(string[] args)
{
Access ac1=new Access();
Console.WriteLine("Enter your name: ");
ac1.name = Console.ReadLine();
ac1.print();
}
}
答案 0 :(得分:1)
此类变量或功能(受保护)只能在中访问 儿童班
Access ac1=new Access();
...
ac1.name = Console.ReadLine(); //You would be getting error here.
这很明显,因为您没有通过派生类的实例访问基类的protected
成员,但是您正在创建基类的对象,即Access并尝试访问其protected
成员导致错误。
如果您创建派生类的对象,即MyProgram,那么您将能够访问protected
成员。
MyProgram p=new MyProgram();
p.name = Console.ReadLine(); // No Error!!
答案 1 :(得分:0)
受保护的成员只能由同一类或结构中的代码或派生类访问。
ac1.name = Console.ReadLine();
您正尝试通过Access
(基类)的对象访问名称,该对象不允许受保护的成员使用。如果您想要访问它,请将其更改为公共或通过MyProgram
(派生类)的对象进行访问。
MyProgram p=new MyProgram();
p.name = Console.ReadLine(); // allowed as MyProgram is derived class from Access class
答案 2 :(得分:0)
你没有在这里使用继承
Access ac1=new Access();
您正在此处制作对象并调用无法使用的受保护成员。
如果你想使用继承,那就像
一样class MyProgram: Access
{
//Make a non-static method and this field would be available
public void ma()
{
//you will find the field here
this.name ="some name"
}
static void Main(string[] args)
{
//Error here
Access ac1=new Access();
Console.WriteLine("Enter your name: ");
//field would not be available here because you are making object
ac1.name = Console.ReadLine();
ac1.print();
//Do it like
//it would work because of inheritance
var localObject = new MyProgram()
localObject.name = Console.ReadLine();
localObject.print();
}
}