首先:類成員的訪問級別是以類的訪問級別為上限的!
也就是類的訪問級別低時,類成員的訪問級別高也無法突破類的訪問級別
public級別,作用域是這個解決方案()
internal級別,作用域是整個裝配集(Assembly)
protected級別,作用域是整個解決方案()中以它自己的類為基類以及它的派生類
private級別,作用域是它自己的類內部(class)
以下的例子中把人可以操作的和人不可以操作的通過修飾類型進行划分(人可以操作的有加油加速這種動作,而人不能憑借意念隨便修改發動機轉速等)
public class Vehicle
{
封裝的字段,屬性和函數:(這些都不允許隨便被賦值,直接用private封裝,用只讀屬性來調用現實)
protected int _rpm;// 發動機轉速,也應該封裝成屬性,但是為了演示protected的效果我把他寫成protected修飾的字段,protected一般是給方法用的,比如下面的Burn函數。
private int _fuel;//油量
private int _speed//速度
{
get{ return _rpm / 100;}
}
//耗油(發動機的事情),我既不想把Burn方法暴露給外界引發錯誤調用,又想讓我的子類Car訪問,使用protected
protected void Burn(int a)
{
_fuel = _fuel - a;
}
/暴露出來的函數:/
//加油(人的事情)
public void Refuel()
{
_fuel = 100;
}
//加速_汽車通用_1000(人的事情)
public virtual void Accelerate()
{
Burn(1);
_rpm += 1000;
}
//看速度表(人的事情)
public void ShowSpeed()
{
Console.WriteLine(Speed);
}
//看油表(人的事情)
public void ShowFeul()
{
Console.WriteLine(_fuel);
}
}
小轎車類
public class Car : Vehicle
{
//加速_轎車專用_1500(人的事情)
public override void Accelerate()
{
Burn(1);
_rpm += 1500;
}
}
跑車類
public class RaceCar : Car
{
//渦輪增壓_跑車特有_3000(人的事情)
public void TurBoAccelerate()
{
Burn(2);
_rpm += 3000;
}
}
公交車類
這里又有protected的一個特性,只有在通過派生類類型發生訪問時,基類的受保護成員在派生類中才是可訪問的
換句話說,就是以出現protected的類為基類,派生出的類,在這個類內部才可以用protected修飾的字段,屬性和方法。
public class Bus : Vehicle
{
public void SlowAccelerate()
{
Burn(1);
_rpm += 500;//這里可以使用_rpm
}
static void Main(string[] args)
{
Bus bus = new Bus();
bus._rpm = 10000;‘//這里可以使用_rpm
bus.Burn(1);//這里可以使用Burn()
}
}
但是如果在其他類中,比如:
class Program
{
static void Main(string[] args)
{
Bus bus = new Bus();
bus.Burn(1);//這句話無法編譯通過
bus._rpm = 10000;//這句話無法編譯通過
}
}
雖然還是派生類的實例對象,但是不在派生類中,所以protected修飾的字段和屬性是無法執行的。