语法

关于类属性的访问权限

对于Python来说,并不存在私有属性——虽然提供了一个双下划线的“人为定义”,这使得你在直接访问时获取到Exception,但这只是提示你,访问该属性是一个危险操作,应该规避这种访问方式——你还是可以获取到该内存。

如果只是开发一个exe程序,这个方式简单而高效——我们仅需要编译器告诉我们哪些访问是危险的。因为绝大多数情况下,我们既然设计了某个属性,就意味着它作为变量,是允许读写的——至于错误的读写,是用户使用不当的问题!

当然库(广义概念的库,包括统一程序中的辅助类、基类等)的开发就是另一码事儿了。当某一个对象与外界交互时,外界并不需要知道你的所有细节——接口就够了,包括接口函数和接口属性。其他的,是你内部设计的问题,与外界无关。

这里的外界,还包括两部分——纯粹的外部系统,以及拓展子类。

C# 中,关于属性,有以下几种形式:

  • Filed
  • Property
  • Index
  • Attribute

Field,应该作为内部的变量,仅供类内使用(包括protected继承给子类)。所以一般定义为 protected string _abc;

Property 只读接口:

  • public string abc => _abc,表示提供 _abc 的访问接口,但不提供改写接口。
  • public string abc{get;} ,创建一个属性,并且只提供访问(且子类无权限set),相当于 private string _abc;  pulic string abc => abc;

Property 读写接口: publi string abc{get; set;},这与定义一个Filed: public string abc 作用相同。不同的是,我们可以重写get/set访问器,来实现自定义的读写操作,如控制写入参数的范围。

注意,一般的Property都是public修饰,因为如果不需要外部访问或仅仅对子类开放,定义为 protected Filed 即可。

总结:C# 访问是按照外部访问权限定义关键字的,一般的,对于Filed,多定义为protected(除非严格禁止子类继承时,使用private),其作用是存储数据;而对于Property,一般定义为public,其作用是 存储数据+外部交互,使用时更像一个接口(函数)。

关于C#多态的思考

https://www.cnblogs.com/brt3/p/9744070.html

架构与模式

抽象类实现接口类的类型冲突(未解决)

在《设计模式:示例与思考》里介绍桥接模式时,遇到一个问题:最初我的设计是面向接口的:

public interface ISoftWare{void run();
}public interface IHardWare{void drive();void software_install(ISoftWare software);void software_execute();
}

接着,我发现 ISoftWare 和 IHardWare 可以进一步实现:

public abstract class SoftWare: ISoftWare{public HardWare env{get;set;}protected abstract void function();  // 软件功能代码(我们假设功能代码与环境无关,也就是Java跨平台特性)public void run(){  // run() 就是一个 Template Method.this.env.drive();  // 软件运行需要载入系统运行时this.function();}
}

但在实现 HardWare 的抽象类时,遇到了问题:

public abstract class HardWare: IHardWare{public SoftWare software{get;set;}public abstract void drive();public void software_install(SoftWare software){  // we need change the ISoftWare to Abstract SoftWarethis.software = software;this.software.env = this;}public void software_execute(){this.software.run();}
}

由于 software_install 方法在实现时,需要定义属性 software 的属性值,但对于 IHardWare,它并不知道 software 属性的存在。

那么要想编译成功,我们就需要将接口改成 SoftWare 对象。但 interface 去依赖 ConcreteClass?这个并不合理。

没办法,只能选择了 HardWare 不再实现接口——但这个实现在逻辑上是有意义的:我们面向接口编程,而 HardWare 不过是对接口的一种实现而已,我们无法保证抽象类是顶层接口,它的若干实现并不一定具有普遍性——普遍性的依然是接口类。

转载于:https://www.cnblogs.com/brt3/p/9739197.html

my questions of C#相关推荐

  1. R使用LSTM模型构建深度学习文本分类模型(Quora Insincere Questions Classification)

    R使用LSTM模型构建深度学习文本分类模型(Quora Insincere Questions Classification) Long Short Term 网络-- 一般就叫做 LSTM --是一 ...

  2. 35+ Top Apache Tomcat Interview Questions And Answers【转】

    原文地址:https://www.softwaretestinghelp.com/apache-tomcat-interview-questions/ Most frequently asked Ap ...

  3. 机器学习面试题合集Collection of Machine Learning Interview Questions

    The Machine Learning part of the interview is usually the most elaborate one. That's the reason we h ...

  4. Reading Club Questions Feedback

    Reading Club Questions Feedback 文章目录 Reading Club Questions Feedback Paper 1 Title Keywords (Domain) ...

  5. THE QUESTIONS :The Top 25 (what we don't know?)

    Essays by our news staff on 25 big questions facing science over the next quarter-century. > What ...

  6. 转:C# Interview Questions

    转自: http://blogs.crsw.com/mark/articles/252.aspx C# Interview Questions This is a list of questions ...

  7. Some Essential JavaScript Questions And Answers(6)

    Some Essential JavaScript Questions And Answers Question11: Write a simple function (less than 160 c ...

  8. Some Essential JavaScript Questions And Answers(5)

    Some Essential JavaScript Questions And Answers Question 9: Discuss possible ways to write a functio ...

  9. Some Essential JavaScript Questions And Answers(4)

    Some Essential JavaScript Questions And Answers Question7: What is NaN? What is its type? How can yo ...

  10. Some Essential JavaScript Questions And Answers(3)

    Some Essential JavaScript Questions And Answers Question5: What is the significance, and what are th ...

最新文章

  1. 大三后端暑期实习面经总结——SSM微服务框架篇
  2. PYQT5登录界面跳转主界面方法
  3. opencv 卡尔曼 java_卡尔曼滤波经典例子(opencv)
  4. poj 1741 Tree
  5. pythonspark集群模式运行_有关python numpy pandas scipy 等 能在YARN集群上 运行PySpark
  6. Android以当前Activity为基准进行截屏
  7. Android控件扫光动画,完美起航-AndroidTV控件获得焦点的扫光效果
  8. vb6 设计模式 mscomm该部件的许可证信息没有找到_廊坊人脸识别系统报价,塔机黑匣子,供求信息...
  9. Spring 实践 -拾遗
  10. python configparser 空格_python的ConfigParser模块
  11. zookeeper3.4.6 使用研究
  12. corntab主调度脚步
  13. 使用vue-cli3创建项目的时候出错,ERROR command failed: npm install --loglevel error --registry
  14. 硬件工程师成长之路(10.1)——芯片选型
  15. 物联网和边缘部署的5大嵌入式工控机设计要求
  16. python第三方库 invalid requirement_python第三方库安装出问题
  17. HTML在线转换JS
  18. A股-股票程序自动化交易接口
  19. 某女28天断食全记录,120—84
  20. 喜欢在大雨中奔跑的感觉

热门文章

  1. 华为鸿蒙系统自动驾驶,华为高阶自动驾驶 + 华为鸿蒙 OS 车机系统体验
  2. datagridview如何将sqlite实现多表查询_服气!月薪3W的Exceler,居然是这样合并多表数据的...
  3. 响应式Web设计 viewport 移动端页面自适应
  4. 深度学习在CTR预估中的应用 文献收藏
  5. Redis进阶实践之十八 使用管道模式提高Redis查询的速度
  6. JQuery基本获取值的方式
  7. rsync的介绍及参数详解,配置步骤,工作模式介绍
  8. C#递归遍历指定目录下文件和文件夹
  9. Dapper基础用法
  10. 基于Tomcat的JSP开发过程中的中文乱码问题解决