点点滴滴的成长[2011111]:理解C#修饰符

指挥者
namespace Bulider
{
class ComputerDirctor
{
public void CreateComputer(ComputerBulider computerBulider)
{
computerBulider.CreateComputerName();
computerBulider.CreateComputerMemory();
computerBulider.CreateComputerDiskSize();
}
}
}


    小菜,2009年正式学习C#,之前对C有基础编写能力,java也学过半年,delphi用过半年。最终选着了.Net,在此不想谈什么门户之争。C#学到如今也已经有3年了,多多少少的实际经验,也有些。由于大学主要是自学,所以C#根本没有系统的学习过,没有参加过培训,但是实现各种功能,小菜还是有点小盲目的自信的,应付项目是没有问题。但是我认为,一个好的程序员,不是为了完成工作,而是能够写出非常好的代码,所以小菜今天开始要从基础中重新学习,看看用了很多次的C#能给大家带来什么新的收获,温故知新,是也。

   第一篇C#修饰符,相信大家一提到修饰符,都了然。常用的几种:

类修饰符:public、internal、partial、abstract、sealed、static

成员修符:public、protected、private、internal、sealed、abstract、virtual、override、readonly、const

最近看到一篇关于设计模式的文章,构造者模式,我便自己边看编写,可是写出来。代码如下:

构造者 
构造者

namespace Bulider
{
abstract public class ComputerBulider
{
private Computer _computerInstance;

public Computer ComputerInstance
{
get { return _computerInstance; }
set { _computerInstance = value; }
}

abstract public void CreateComputerName();
abstract public void CreateComputerMemory();
abstract public void CreateComputerDiskSize();

}
}
产品模型 
namespace Bulider
{
class Computer
{
private string _name;

public string Name
{
get { return _name; }
set { _name = value; }
}
private string _memory;

public string Memory
{
get { return _memory; }
set { _memory = value; }
}
private string _diskSize;

public string DiskSize
{
get { return _diskSize; }
set { _diskSize = value; }
}

public void ShowComputerMessage()
{
Console.WriteLine(String.Format("------{0}------", _name));
Console.WriteLine(String.Format("电脑品牌:{0}", _name));
Console.WriteLine(String.Format("电脑内存:{0}", _memory));
Console.WriteLine(String.Format("电脑硬盘:{0}", _diskSize));
}
}
}
产品实例
namespace Bulider
{
class Asus : ComputerBulider
{
public override void CreateComputerName()
{
ComputerInstance = new Computer();
ComputerInstance.Name = "Asus";
}

public override void CreateComputerMemory()
{
ComputerInstance.Memory = "5GB";
}

public override void CreateComputerDiskSize()
{
ComputerInstance.DiskSize = "250GB";
}
}
}
namespace Bulider
{
class Program
{
static void Main(string[] args)
{
ComputerDirctor computerDirctor = new ComputerDirctor();
ComputerBulider asus = new Asus();
//asus.ComputerInstance.ShowComputerMessage();
ComputerBulider apple = new Apple();
// apple.ComputerInstance.ShowComputerMessage();
ComputerBulider acer = new Acer();
//acer.ComputerInstance.ShowComputerMessage();
computerDirctor.CreateComputer(asus);
asus.ComputerInstance.ShowComputerMessage();
computerDirctor.CreateComputer(apple);
apple.ComputerInstance.ShowComputerMessage();
computerDirctor.CreateComputer(acer);
acer.ComputerInstance.ShowComputerMessage();
Console.ReadLine();

}
}

基本上一个简单的构造者模式,大家可以看看,这几个类的修饰符,程序 貌似看上去没问题,但是运行的话会报出错的信息:错误 1 可访问性不一致: 属性类型“Bulider.Computer”比属性“Bulider.ComputerBulider.ComputerInstance”的可访问性低 D:\DB\Bulider\Bulider\Bulider\ComputerBulider.cs 12 25 Bulider。

问题的原因在这里,  public Computer ComputerInstance
        {
            get { return _computerInstance; }
            set { _computerInstance = value; }
        }这里作为一个属性,将产品暴露给了 public 修饰的Class。而产品的默认修饰,是空,即   internal,因为public暴露了权限给程序集外,而internal修饰的产品,仅能在程序内部调用,所以修饰符优先级的问题引起异常。

这令我更加深入的理解了修饰符的概念,相信很多老程序员,不小心下也有过类似的问题吧。

小菜,写完了,也许您看的很简单,或者是很弱智的问题,但是小菜真的从中更加深了对修饰符的理解。s

原文地址:https://www.cnblogs.com/BinaryBoy/p/2231256.html