由于构造函数中的“保护级别”错误,C#“无法访问”

时间:2011-03-16 18:02:38

标签: c# inheritance encapsulation access-modifiers

子类“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;
        }

    }
}

----------------------------- 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);
        }

4 个答案:

答案 0 :(得分:7)

看起来你在定义派生类构造函数时犯了一个错误。如果要将nametype值赋予超类,则必须将它们作为附加构造函数参数传递(在派生类构造函数中总共有4个参数。)例如,改变它应该工作:

    public Caesar(int shiftamount, 
                  string shiftdirection, 
                  string name, 
                  string type) 
                  : base(name, type)

您可以采取其他一些策略。

答案 1 :(得分:5)

    public Caesar(int shiftamount, string shiftdirection)
        : base(name, type)
    {

问题是private字段的名称和类型 - 除非将protected标记为 public Caesar(int shiftamount, string shiftdirection) : base("Caesar5", "Caesar") { ,否则子类无法访问它们。我怀疑你真正想要的是

{{1}}

答案 2 :(得分:4)

无法从派生类访问私有成员。受保护和公众可以。你必须保护他们。这样,只有班级及其“孩子”才能访问。

访问权限摘要:

  • private:只能从该类方法访问,没有别的
  • 可以从该类及其子级的方法访问
  • protected:
  • internal:只能从同一程序集中的方法访问
  • protected internal:与来自其他程序集的派生类的内部+方法相同
  • 每个人都可以访问
  • public:

答案 3 :(得分:3)

private表示声明类可以访问成员(意味着继承的类型也不能)。

protected表示声明类和任何后代都可以访问成员,但那些类型之外的类型不能。

另外,在.NET语言中通常不使用getter和setter函数。属性封装了此功能,而应该使用它。例如;

private string name;

public string Name
{
    get { return name; }
    set { name = value; }
}