C# 更改子类内的私有变量

C# 更改子类内的私有变量,c#,protection,levels,C#,Protection,Levels,我理解,私有保护级别意味着阻止任何孩子访问私有父变量 但是,难道没有一种方法可以通过访问器和变异器get和set来实现吗?我必须有某种方法来改变一个私有字符串,因为那是家庭作业 我有一个公共的抽象宠物类,名字有一个私有字符串。我想创建一只狗并使用该字符串名称。不过我想不出来。因为这是家庭作业,我知道我不能得到代码或任何东西,但有人能指出这样做的方法,让我可以谷歌它吗?我所有的搜索都暗示这是不可能的 这是我的代码,如果有帮助的话 编辑 我不能让它受到保护 public abstract class

我理解,私有保护级别意味着阻止任何孩子访问私有父变量

但是,难道没有一种方法可以通过访问器和变异器get和set来实现吗?我必须有某种方法来改变一个私有字符串,因为那是家庭作业

我有一个公共的抽象宠物类,名字有一个私有字符串。我想创建一只狗并使用该字符串名称。不过我想不出来。因为这是家庭作业,我知道我不能得到代码或任何东西,但有人能指出这样做的方法,让我可以谷歌它吗?我所有的搜索都暗示这是不可能的

这是我的代码,如果有帮助的话

编辑 我不能让它受到保护

public abstract class Pet
    {

        private string name;
        private string species;

        public abstract void speak();
        public abstract void play();
        public abstract void info();

    }
儿童狗课程的一部分

 class Dog : Pet
    {

        public Dog(string xname, string xspecies)
        {
            this.name = xname; // this is where I'm having trouble.
        }                     

我认为您正在寻找访问修饰符,这意味着该变量可以在其类内以及通过派生类实例访问:


让我们确保你有一个清晰和准确的理解;许多初学者从细微的谎言中学习

我理解,私有保护级别意味着阻止任何孩子访问私有父变量

这是对该功能意图的正确总结。基本上,您是说访问控制修饰符是用于控制访问的,这一点并不奇怪

然而,我想在这里指出两个微妙之处

首先,访问修饰符控制对事物名称的访问,而不是对事物的访问。当您有名为foo的成员时,名称foo只能用于从该成员的可访问性域中引用该成员。可访问域是程序文本的一个区域;私有成员的可访问域是声明该成员的类型的文本

如果您提出了引用成员的其他方法,则该机制不受可访问性修饰符的控制。可访问性修饰符控制的唯一一件事是名称在程序文本中的使用位置

确保你的头脑清楚

其次,您注意到私有成员对于子级是不可访问的,我假定您指的是派生类。在这种情况下,派生类可以按名称访问私有成员。根据我到目前为止所说的,你应该能够推断出它是什么。想一想,然后继续读下去

我说过私有成员只能在声明类型的文本中通过名称访问,因此如果派生类可以通过名称访问私有成员,则派生类必须在声明类型的文本中:

这是合法的,因为x在其可访问域内按名称使用

那么,你是如何做作业的呢?只有两种方法:

1把狗放在宠物里面;任何狗都可以接触到宠物的所有私人成员。这是C的高级玩家专用功能,几乎肯定不是你的导师想要的。但这是一个非常强大的技巧,我经常使用它,所以在你以后的职业生涯中记住它;特别是,当您了解工厂模式时,您可以从后面的口袋里掏出知识,将派生类放入基类中是使工厂模式正常工作的一个好技巧

2为私有成员创建一些访问器机制,并将该访问器机制的名称设置为受保护的、内部的或公共的

通常,您会使用一个属性。在C中使用只读访问器创建属性,如下所示:

class Base
{
  private int x;
  public int X { get { return x; } }
}
或者,在更现代的C版本中,您可以使用以下简短形式:

  public int X => x;
现在,Base之外的代码不能按名称使用x,因为它在Base.x的可访问性域之外。但是X有一个不受限制的可访问域,所以它可以在你喜欢的任何地方使用

这是一个只读访问器。要创建写访问器,请添加setter:

  public int X 
  { 
    get { return x; } 
    set { x = value; } 
  }
请注意,setter有一个神奇的值名称,即要分配给属性的值

还有其他的方法来创建访问器,但这是目前为止最常见的方法

当我们查看您的代码时,还有两件事:

一,

在C语言中,公共方法应该是PascalCasedLike,而不是小写。它只是一种任意约定,使您的代码更易于阅读

二,

为什么信息无效返回?当然,它应该返回一些信息

三,


你的意图是进一步细分狗吗?可能不是,因为它不是抽象的。考虑不打算将类归类为密封的类,这样您就不必担心为安全继承设计类。<如果要在构建过程中设置这些参数,请考虑在PET中添加受保护的构造函数,这样就可以设置名称和物种。然后,您的Dog构造函数可以使用以下值调用基本构造函数:public Dogstring xname、string xspecies:basexname、xspecies{}。如果使用system.reflection,您将失败
你的家庭作业。就是这样!我在我的C++中用类似的记忆跳舞,但是我正在创建一个狗对象X,并试图使用x.Nead。这正是我想要的。此外,是的,信息将返回一些东西。这是一个热门话题。我只是暂时在void上加了一个,只是为了得到一个基本的提纲。我通常一次只处理一部分程序。编辑我来修理这个箱子。谢谢
  public int X => x;
  public int X 
  { 
    get { return x; } 
    set { x = value; } 
  }
    public abstract void speak();
    public abstract void play();
    public abstract void info();
 class Dog : Pet