Jef*_*dan 0 c# protection levels
我了解私有保护级别旨在阻止任何孩子访问私有父变量。
但是没有办法使用存取器和变异器(获取和设置)吗?我必须采用某种方式来更改私有字符串,因为这是家庭作业。
我有一个公共抽象宠物课,带有一个私有字符串来命名。我想创建一条狗并使用该字符串名称。不过我不知道。既然是家庭作业,我知道我无法获得代码或任何东西,但是有人可以指出执行此操作的方法,以便我可以在Google上搜索吗?我所有的搜索都暗示这是不可能的。
这是我的代码,如果有帮助的话。
编辑 我不能仅仅保护它。
public abstract class Pet
{
private string name;
private string species;
public abstract void speak();
public abstract void play();
public abstract void info();
}
Run Code Online (Sandbox Code Playgroud)
幼犬课程的一部分...
class Dog : Pet
{
public Dog(string xname, string xspecies)
{
this.name = xname; // this is where I'm having trouble.
}
Run Code Online (Sandbox Code Playgroud)
让我们确保您有一个清晰准确的理解;许多初学者被教会了一些微妙的错误。
我了解私有保护级别旨在阻止任何孩子访问私有父变量。
这是的正确总结意图的功能。基本上,您是说访问控制修饰符用于控制访问,这并不奇怪。
但是,我想在这里指出两个微妙之处。
首先是访问修饰符控制对事物名称的访问,而不是对事物的访问。当您有一个命名的成员时foo,该名称foo只能用于从该成员的可访问性域中引用该成员。“可访问性域”是程序文本的区域;私有成员的可访问域是声明该成员的类型的文本。
如果您想出其他方法来引用成员,则该机制不受accessibility修饰符的控制。可访问性修饰符控制的唯一一件事就是在程序文本中可以使用该名称的位置。
确保头脑清楚。
其次,您注意到private“儿童”无法访问成员,我假设您的意思是派生类。 在某些情况下,派生类可以按名称访问私有成员。 根据我到目前为止所说的,您应该可以推断出它是什么。考虑一下,然后继续阅读。
我说过,私有成员只能通过声明类型的文本内部进行名称访问,因此,如果私有成员可以通过派生类的名称进行访问,则派生类必须位于声明类型的文本内:
class Base
{
private static int x;
class Derived : Base
{
static void M() { Console.WriteLine(Base.x); }
}
}
Run Code Online (Sandbox Code Playgroud)
这是合法的,因为x在其可访问性域内按名称使用。
那么,您如何处理家庭作业问题?只有两种方法:
(1)放在Dog里面Pet;任何人Dog都可以访问的所有私有成员Pet。这是C#的“仅适用于高级玩家”功能,几乎可以肯定不是您的教练正在寻找的功能。但这是一项非常强大的技术,我会经常使用,因此在以后的工作中要牢记这一点;尤其是,当您了解“工厂模式”时,您可以从口袋里掏出一些知识,即将派生类放在基类中是使工厂模式正常工作的好技巧。
(2)为私有成员建立某种访问器机制,并使该访问器机制的名称受保护,内部或公开。
通常,您会使用属性。您可以使用C#中的只读访问器来创建属性,如下所示:
class Base
{
private int x;
public int X { get { return x; } }
}
Run Code Online (Sandbox Code Playgroud)
或者,在更现代的C#版本中,您可以使用以下简短格式:
public int X => x;
Run Code Online (Sandbox Code Playgroud)
现在,Base不能x按名称使用之外的代码,因为它不在的可访问性域之内Base.x。但是X具有不受限制的可访问性域,因此可以在任何您喜欢的地方使用它。
这是一个只读访问器。要创建写访问器,请添加一个setter:
public int X
{
get { return x; }
set { x = value; }
}
Run Code Online (Sandbox Code Playgroud)
请注意,setter具有一个神奇的value名称,该名称是要分配给该属性的值。
还有其他制作访问器的方法,但这是最常见的方法。
在查看您的代码时,还有其他几件事:
(1)
public abstract void speak();
public abstract void play();
public abstract void info();
Run Code Online (Sandbox Code Playgroud)
在C#中PascalCasedLikeThis,公共方法应为,而不是lowercase。这只是一个任意约定,可以使您更轻松地阅读代码。
(2)
为什么info无效返回?当然,它应该返回一些信息。
(3)
class Dog : Pet
Run Code Online (Sandbox Code Playgroud)
您打算进一步细分Dog吗?可能不是,因为不是abstract。考虑将不打算被子类化的类标记为sealed,这样您就不必担心为安全继承而设计该类。
| 归档时间: |
|
| 查看次数: |
255 次 |
| 最近记录: |