protected用法是:访问仅限于包含类或从包含类派生的类型;private用法是:访问权限仅限于此类中;下面是我写了一个简单代码,令我不解的是:如果在父类中声明一个属性用protected修饰,我在子类中如果想调用父类中被protected修饰的属性时,必须先将父类中的被protected修饰的属性进行封装才可以。如果不对父类中被protected修饰的属性进行封装的话:
程序就会报错:“错误 无法通过类型“ConsoleApplication3.BaseTest”的限定符访问保护成员“ConsoleApplication3.BaseTest.b”;限定符必须是类型“ConsoleApplication3.ChildTest”(或者从该类型派生)的“
这是为什么啊?怎么protected的用法和private的用法都一样啊??搞不懂啊!!(以下是代码)using System;
using System.Collections.Generic;
using System.Text;namespace ConsoleApplication3
{
/// <summary>
/// 父类
/// </summary>
class BaseTest
{
public int a = 10;
//如果不对protected b进行封装的话,会报错
protectedint b = 2; }
}using System;
using System.Collections.Generic;
using System.Text;namespace ConsoleApplication3
{
/// <summary>
/// 子类
/// </summary>
class ChildTest:BaseTest
{
int c;
int d;
public void printTest()
{
BaseTest basetest = new BaseTest();
this.a = basetest.a;
//当程序走到这一步时就不报错!不知道怎么回事(感觉怎么和private用法差不多啊,别的类调用时进行封装才可以)
this.c = basetest.b;
}
}
}
程序就会报错:“错误 无法通过类型“ConsoleApplication3.BaseTest”的限定符访问保护成员“ConsoleApplication3.BaseTest.b”;限定符必须是类型“ConsoleApplication3.ChildTest”(或者从该类型派生)的“
这是为什么啊?怎么protected的用法和private的用法都一样啊??搞不懂啊!!(以下是代码)using System;
using System.Collections.Generic;
using System.Text;namespace ConsoleApplication3
{
/// <summary>
/// 父类
/// </summary>
class BaseTest
{
public int a = 10;
//如果不对protected b进行封装的话,会报错
protectedint b = 2; }
}using System;
using System.Collections.Generic;
using System.Text;namespace ConsoleApplication3
{
/// <summary>
/// 子类
/// </summary>
class ChildTest:BaseTest
{
int c;
int d;
public void printTest()
{
BaseTest basetest = new BaseTest();
this.a = basetest.a;
//当程序走到这一步时就不报错!不知道怎么回事(感觉怎么和private用法差不多啊,别的类调用时进行封装才可以)
this.c = basetest.b;
}
}
}
public void printTest() : base()
{
BaseTest basetest = new BaseTest();
this.a = basetest.a;
//当程序走到这一步时就不报错!不知道怎么回事(感觉怎么和private用法差不多啊,别的类调用时进行封装才可以)
this.c = basetest.b;
}
换成
ChildTest basetest = new ChildTest();
就不报错,子类中实例化父类编译器认为是在类外部访问
我有个问题想问问你啊?如果我声明了一个protected修饰的属性然后在对它进行封装是什么意思啊?
就好比这样啊:
private int a; protected int A
{
get { return a; }
set { a = value; }
}
class A
{
private int a = 0;
public void foo(A other_a)
{
a = 1; // a是成员变量
other_a.a = 2; // error, 这个a分明是另一个对象的,关成员变量什么事情?!
}
}这好比说钱包对于一个人来说是私有的。那当然是指张三的钱包对于张三来说是私有的,李四的钱包对于李四是私有的。你怎么会觉得只要是人,都可以看见钱包都能拿,张三能拿李四的钱包么?所以表面上看你是不懂语法,实际上你根本就不知道面向对象是什么,你要用程序做什么。
如: protected string Name{get;set;}
我知道这是用了一个自动属性,但是我不懂,父类中的属性既然是protected修饰的 ,为什么还要对他进行 封装字段是他变为属性哪? 我试了一下,如果写成:“protected string Name{get;set;}”这样是不是失去了protected的作用啊?