• 点点滴滴的成长[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

  • 相关阅读:
    scrapy的自动限速(AutoThrottle)扩展
    js可以控制文件上传的速度吗?
    用DataReader 分页与几种传统的分页方法的比较
    jdbc分页查询
    几种分页方式分析.
    mybatis下的分页,支持所有的数据库
    java 物理分页和逻辑分页
    IBatis的分页研究
    JDBC分页
    用Java实现异构数据库的高效通用分页查询功能
  • 原文地址:https://www.cnblogs.com/BinaryBoy/p/2231256.html
Copyright © 2020-2023  润新知