博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
my questions of C#
阅读量:7214 次
发布时间:2019-06-29

本文共 2286 字,大约阅读时间需要 7 分钟。

语法

关于类属性的访问权限

对于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,其作用是 存储数据+外部交互,使用时更像一个接口(函数)。

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 SoftWare this.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

你可能感兴趣的文章
优点和阵列的缺点,并且一个链表
查看>>
CSS3透明属性opacity
查看>>
Genymotion模拟器的安装及常见问题解决方法
查看>>
PHP 乘法口诀表
查看>>
如何彻底关闭windows update
查看>>
SpringMVC+SwfUpload进行多文件同时上传
查看>>
ASP.NET Core中的依赖注入(2):依赖注入(DI)
查看>>
Java_JAVA6动态编译的问题
查看>>
scala 日期格式转换
查看>>
Filtering Specific Columns with cut
查看>>
多线程编程1-NSThread
查看>>
反馈组态的判别
查看>>
【Web】Rest API 验证授权如何做?
查看>>
Swift 中的 @autoclosure
查看>>
多迪将企业的Python工程师定位成哪几类?
查看>>
Rom 检测
查看>>
【iOS工具】rvm、Ruby环境和CocoaPods安装使用及相关报错问题解决(2016 12 15 更新)...
查看>>
Weex学习指南
查看>>
TiDB DevCon 2019 报名开启:年度最高规格的 TiDB 技术大会
查看>>
React Native 初体验
查看>>