继承“Access”类中的类在使用“protected”关键字时出错

时间:2014-07-09 06:32:58

标签: c# inheritance

我是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();
    }
}

3 个答案:

答案 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();
    }
}