C#无法从void main调用protected方法

时间:2016-08-09 08:04:15

标签: c# .net

我有以下代码:

 fscanf(fpointer, "%[^:]:", filesName);

此代码正常运行并打印using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication2 { abstract class parent { public abstract void printFirstName(); protected virtual void printLastName() { Console.WriteLine("Watson"); } protected void printMiddlename() { Console.WriteLine("Jane"); } } class child: parent { public override void printFirstName() { Console.WriteLine("Mary"); } protected override void printLastName() { Console.WriteLine("Parker"); } public void getMiddleName() { printMiddlename(); } } class Program: child { static void Main(string[] args) { child ch = new child(); ch.printFirstName(); ch.getMiddleName(); //ch.printLastName(); Console.Read(); } } }

但是,当我取消注释Mary Jane时,它会显示编译错误:

enter image description here

为什么我的程序类无法调用Child Class的受保护方法?特别是当子类调用Parent类的受保护方法ch.printLastName();时没有问题?

6 个答案:

答案 0 :(得分:4)

我猜您会混淆继承访问级别

您的Glide.with(mContext) .load(doctorDetailsList.get(0).getDoc_imgurl().replace("200x200", Measuredwidth + "x" + Measuredwidth)) .placeholder(R.drawable.no_image) .override(Measuredwidth, Measuredwidth) .into(new Target<GlideDrawable>() { @Override public void onLoadStarted(Drawable placeholder) { } @Override public void onLoadFailed(Exception e, Drawable errorDrawable) { } @Override public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) { // GlideDrawable dr = resource; Bitmap bitmap = ((com.bumptech.glide.load.resource.bitmap.GlideBitmapDrawable) resource).getBitmap(); String filename = doctorDetailsList.get(0).getDoc_imgurl().trim().substring(doctorDetailsList.get(0).getDoc_imgurl().trim().lastIndexOf("/") + 1); filename = filename.replaceAll(".jpg", ""); int resID = getResources().getIdentifier(filename, "data", getPackageName()); Bitmap icon = BitmapFactory.decodeResource(mContext.getResources(), resID); //Drawable d = new BitmapDrawable(getResources(), Bitmap.createScaledBitmap(bitmap, 200, 200, true)); RoundedBitmapDrawable circularBitmapDrawable = RoundedBitmapDrawableFactory.create(mContext.getResources(), icon); circularBitmapDrawable.setCircular(true); // GlideDrawable gd = new GlideDrawable(resource,) getSupportActionBar().setLogo(circularBitmapDrawable); } @Override public void onLoadCleared(Drawable placeholder) { } @Override public void getSize(SizeReadyCallback cb) { } @Override public void setRequest(com.bumptech.glide.request.Request request) { } @Override public com.bumptech.glide.request.Request getRequest() { return null; } @Override public void onStart() { } @Override public void onStop() { } @Override public void onDestroy() { } }); Program继承 printFirstName方法。所以里面你的child类可以访问该方法:

Program

外部一个类,您无法访问class Program : child { void Method() { this.printFirstName(); } } 方法。但是从 inside 一个类中,您可以访问实例相同类型的protected方法

protected

但您无法访问其他类型实例的class Program : child { void Method() { Program p1 = new Program(); p1.printFirstName(); // this works child c1 = new child(); p1.printFirstName(); // this gives your compiler error } 方法,即使它是您派生的类型。

有关详细信息,请参阅MSDN about access levels

答案 1 :(得分:2)

C#规范第1.6.2节可访问性

  

类的每个成员都有一个相关的辅助功能,它可以控制   程序文本的区域,可以访问该成员

     

public - 访问权限不受限制

     

受保护 - 访问限于此类或从此类派生的类

受保护的成员只能在当前类(定义它)和从中派生的类中访问。

换句话说,您只能通过lblerrortoday访问它。

答案 2 :(得分:1)

printLastName受到保护。查看有关access modifiers

}的MSDN页面:

  

受保护

     

只能通过同一个类或结构中的代码,或者从该类派生的类中访问类型或成员。

答案 3 :(得分:1)

受保护的关键字表示只有从该类型派生的类型和类型才能访问该成员。 所以在这种情况下你不能从程序访问Child.printLastName()因为它有两个级别

Parent.printLastName() - &gt;保护 Child.printLastName() - &gt;保护

从程序类调用Child.printLastName()时,继承如何工作 它调用Parent.printLastName() - &gt; Child.printLastName()但是父类不可访问,它显示的是编译错误的区域。

解决方案: -

你可以制作 Parent.printLastName() - &gt;内部访问修饰符

因此可以在此程序集中访问Parent.printLastName()。

命名空间ConsoleApplication2     {         抽象类父         {             public abstract void printFirstName();

        internal virtual void printLastName()
        {
            Console.WriteLine("Watson");
        }

        public void printMiddlename()
        {
            Console.WriteLine("Jane");
        }
    }

   class child : parent
    {
        public override void printFirstName()
        {
            Console.WriteLine("Mary");
        }

        protected override void printLastName()
        {
            Console.WriteLine("Parker");
        }

        public void getMiddleName()
        {
            printMiddlename();
        }
    }


   class Program : child
    {
        static void Main(string[] args)
        {
            child ch = new child();

            ch.printFirstName();
            ch.getMiddleName();
            ch.printLastName();

            Console.Read();
        }

    }
}

答案 4 :(得分:0)

在外行人的术语中,标记为protected的方法意味着类本身(子)只能访问从其继承的方法或其他类。

关闭'ch'调用方法的程序无法访问它,但Program的实例(作为其继承的子代)可以调用该方法。

答案 5 :(得分:0)

您的代码与您的问题不符 - 您要问为什么Program类可以调用其父级的受保护方法(即{{1}您的示例中的类) - 但是您的代码显示了一个实例child,试图公开访问受保护的方法 - 该方法按预期失败。

这样可行:

child

或者:

printLastName();