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