C# 类中访问修饰符的优先级与用法(public, internal, protected, private)
首先:类成员的访问级别是以类的访问级别为上限的!
也就是类的访问级别低时,类成员的访问级别高也无法突破类的访问级别
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修饰的字段和属性是无法执行的。
C# 类中访问修饰符的优先级与用法(public, internal, protected, private)的更多相关文章
- C# 中访问修饰符
1.public 完全公开的,公共的 2. private 私有的,只能在当前类的内部访问, 不可修饰类 3.protected 受保护的,只能在当前类的内部以及其子类中访问,不能用来修饰类 4.in ...
- Java中访问修饰符public、private、protecte、default
Java中访问修饰符public.private.protecte.default的意义讲解:public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”.被其修饰的类.属性以及方法不 仅 ...
- 12、类成员访问修饰符public/private/producted/readonly
1.private 类的私有成员 private 类的私有成员,只能在内部访问,在外部访问不到,无法被继承,我们可以将不需要被外部修改的定义为私有的 私有成员,只能在内部访问,在外部访问不到 priv ...
- 【转】C# 中访问修饰符
用通过代码: 类内部 using System;class Mod{ void defaultMethod() { Console.WriteLine("this ...
- C#类的访问修饰符
默认情况下,类声明为内部的,即只有当前工程中的代码才能访问它.可以用internal访问修饰符关键字显式指定,但这不是必须的,类在定义时默认为此类型的类.但是C# 方法默认访问级别: private. ...
- java类的访问修饰符
1.java中外部类的访问修饰符有如下四种: public,默认,abstract,final // public,默认,abstract,final. public class Test1 {} c ...
- java中访问修饰符public,private,protected,friendly的作用域
在修饰的元素上没有写任何的访问修饰符,则表示friendly. 作用域 当前类 同一包中 子孙类 其他包中 public √ √ √ √ protected √ √ √ × private √ x x ...
- Java——类的访问修饰符
1.java中外部类的访问修饰符有如下四种: public,默认,abstract,final // public,默认,abstract,final. public class Test1 {} c ...
- 类的访问修饰符_C#
访问控制修饰符: 访问控制修饰符 类内部 子类 程序集内 程序集外 Default √ Public √ √ √ √ Private √ Internal √ √ √ Protected √ √ Pr ...
随机推荐
- 使用vscode搭建本地的websocket
首先在服务器方面,网上都有不同的对websocket支持的服务器: php - http://code.google.com/p/phpwebsocket/ jetty - http://jetty. ...
- 解决ubuntu终端路劲显示过长问题
1 找到配置文件先进行备份: cp ~/.bashrc ~/.bashrc-bak 2 找到配置文件修改: vi ~/.bashrc 备份是为了防止配置修改出错,可以还原 3 在以下的红色位置 ...
- transform:translate(-50%,-50%)
和父亲元素没关系,走自己盒子宽度一半
- 分布式锁实现(二):Zookeeper
目录 前言 设计实现 一.基本算法 二.关键点 临时有序节点 监听 三.代码实现 Curator源码分析 一.基本使用 二.源码分析 后记 前言 紧跟上文的:分布式锁实现(一):Redis ,这篇我们 ...
- kubeadm部署k8s集群
kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具. 这个工具能通过两条指令完成一个kubernetes集群的部署: # 创建一个 Master 节点 kubeadm ini ...
- C之输入输出函数(1) -- fgets()
https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_71/rtref/fgets.htm #include <stdio.h> ...
- synchronized(this) 与 synchronized(class) 理解
1.概念 synchronized 是 Java 中的关键字,是利用锁的机制来实现同步的. 锁机制有如下两种特性: 互斥性:即在同一时间只允许一个线程持有某个对象锁,通过这种特性来实现多线程中的协调机 ...
- shell脚本每五分钟执行一次可执行程序(nohup)
两种解决方案:个人推荐第二种,使用crontab来定时执行任务 1.shell代码如下: nohup command &. 解释: 后台永久运行command命令. (nohup表示后台永 ...
- 【LeetCode 25】K 个一组翻转链表
题目链接 [题解] 模拟就好. 就k个k个节点地翻转. 每个节点都把next域指向它前面那个节点 修改完之后把这个节点前面的那个节点的next域改成这一段的最后一个节点. 然后把这一段最左边的那个节点 ...
- js设计模式——1.代理模式
js设计模式——1.代理模式 以下是代码示例 /*js设计模式——代理模式*/ class ReadImg { constructor(fileName) { this.fileName = file ...