C#“由于其保护级别而无法访问”构造函数中的错误
子类“caesar”的构造函数给出错误。它说名称、类型由于其保护级别而无法访问。怎么会?由于这是从“Cipher”类派生的子类,因此它不应该给出这样的错误。我该如何克服这种情况。但我希望这些变量是私有的。我不想将它们更改为公开的。
***第二个代码示例有效。有人能看出区别吗?
namespace Encrypter
{
class Cipher
{
public Cipher(string name, string type)
{
setName(name);
setType(type);
}
private string name;
private string type;
public void setName(string newName)
{
name = newName;
}
public string getName()
{
return name;
}
public void setType(string newType)
{
type = newType;
}
public string getType()
{
return type;
}
public string encrypt(string text)
{
return text;
}
public string decrypt(string text)
{
return text;
}
}
}
namespace Encrypter
{
class Caesar : Cipher
{
private int shiftamount;
private string shiftdirection;
public Caesar(int shiftamount, string shiftdirection) : base(name, type)
{
setShiftamount(shiftamount);
setShiftdirection(shiftdirection);
}
public void setShiftamount(int newShiftamount)
{
shiftamount = newShiftamount;
}
public int getShiftamount()
{
return shiftamount;
}
public void setShiftdirection(string newShiftdirection)
{
shiftdirection = newShiftdirection;
}
public string getShiftdirection()
{
return shiftdirection;
}
}
}
-------------------------------------- 新编辑 ----------------
class MyFile
{
public MyFile(int id, string name, int size, string type)
{
setId(id);
setName(name);
setSize(size);
setType(type);
}
private int id;
private string name;
private string type;
private int size;
class Movie : MyFile
{
private string director;
private int release_year;
public Movie(string director, int release_year, int id, string name, int size) : base( id, name, size, "m")
{
setDirector(director);
setRelease_year(release_year);
}
The constructor of the child class "caesar" gives an error. It says that name, type is inaccessible due to its protection level. How come? As this is a child class derived from "Cipher" class it shouldn't give an error like this. How can I overcome this situation. But I want those variables to be private. I don't want to change them as public.
***The second code example works. Can anybody see a difference?
namespace Encrypter
{
class Cipher
{
public Cipher(string name, string type)
{
setName(name);
setType(type);
}
private string name;
private string type;
public void setName(string newName)
{
name = newName;
}
public string getName()
{
return name;
}
public void setType(string newType)
{
type = newType;
}
public string getType()
{
return type;
}
public string encrypt(string text)
{
return text;
}
public string decrypt(string text)
{
return text;
}
}
}
namespace Encrypter
{
class Caesar : Cipher
{
private int shiftamount;
private string shiftdirection;
public Caesar(int shiftamount, string shiftdirection) : base(name, type)
{
setShiftamount(shiftamount);
setShiftdirection(shiftdirection);
}
public void setShiftamount(int newShiftamount)
{
shiftamount = newShiftamount;
}
public int getShiftamount()
{
return shiftamount;
}
public void setShiftdirection(string newShiftdirection)
{
shiftdirection = newShiftdirection;
}
public string getShiftdirection()
{
return shiftdirection;
}
}
}
----------------------------- New Edit ----------------
class MyFile
{
public MyFile(int id, string name, int size, string type)
{
setId(id);
setName(name);
setSize(size);
setType(type);
}
private int id;
private string name;
private string type;
private int size;
class Movie : MyFile
{
private string director;
private int release_year;
public Movie(string director, int release_year, int id, string name, int size) : base( id, name, size, "m")
{
setDirector(director);
setRelease_year(release_year);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
看起来您在定义派生类构造函数时犯了一个错误。如果您想将
name
和type
值传递给超类,则必须将它们作为附加构造函数参数传递(派生类中总共有 4 个参数)构造函数。)例如,将其更改为这样应该可行:您可以采取许多其他策略。
It looks like you have made a mistake in defining the derived class constructor. If you want to get
name
andtype
values to the superclass, you'll have to pass them in as additional constructor arguments (for a total of 4 arguments in the derived class constructor.) For example, changing it to this should work:There are a number of other strategies you could take.
无法从派生类访问私有成员。受保护和公共可以。你必须保护它们。这样,只有该类及其“子级”才能访问。
访问权限摘要:
private:
只能从该类方法访问,protected:
不能从该类及其子方法访问internal:< /code> 只能从同一程序集中的方法访问
protectedinternal:
与来自其他程序集的派生类的内部 + 方法相同public:
可以被所有人访问Private members cannot be accessed from derived classes. protected and public can. You must make them protected. This way, only the class and its "children" will have access.
Summary of access rights:
private:
can be accessed only from that class methods, nothing elseprotected:
can be accessed from that class's and its children's methodsinternal:
can be accessed only from methods within the same assemblyprotected internal:
same as internal + methods of derived classes from other assembliespublic:
can be accessed by everyone问题是
private
字段名称和类型 - 子类无法访问它们,除非它们被标记为protected
。我怀疑你真正想要的是The problem is the
private
fields name and type - the child class cannot access them unless they are marked asprotected
. What your really want I suspect isprivate
意味着只有声明类可以访问成员(这意味着继承类型也不能)。protected
意味着声明类和任何后代都可以访问成员,但这些成员之外的类型则不能。另一方面,.NET 语言中通常不使用 getter 和 setter 函数。属性封装了此功能,并且是应该使用的属性。例如;
private
means that only the declaring class can access the members (meaning that inherited types cannot, either).protected
means that the declaring class and any descendants can access the members, but types outside of those cannot.On a different note, getter and setter functions are generally not used in .NET languages. Properties encapsulate this functionality and are what should be used instead. For example;