oop - 在理解 OOP 时遇到问题。公共成员或获取者和设置者?
问题描述
我正在尝试学习 OOP,我确实阅读了很多关于 OOP 的主题,但我仍然没有完全掌握这些概念。
我要求对此事进行一些澄清,特别是:在班级中有公共成员是否可以,或者我应该始终使用 getter 和 setter?
解决方案
OOP 或面向对象编程是编写程序的一种范式(方法)。基本上,它通过将所有内容视为由类表示的对象来简化程序的创建。
OOP(适用于所有语言)的基本概念很明确:
- 继承: 对象 A(或类)能够从另一个对象继承,比如说Object B。这意味着对象 A,在这种情况下是子对象,将继承对象 B 的属性和方法,在这种情况下,对象 B 是父对象。这个概念意味着您可以重用您的代码。
- 多态性:顾名思义,它比一个对象,更具体地说,一个方法可以采取多种形式。如何?这个概念与继承有关。假设您有一个父类,
Animal
它有一个名为talk()
打印一些文本的方法,并且您有两个子类,分别称为dog
和cat
。talk()
两个子类都会从它们的父类继承方法Animal
。狗和猫都是动物,但它们说话的方式不同。为了解决这个问题,我们将使用多态性的概念重新定义talk()
子类中的方法,而无需更改方法的名称或签名。 - 封装:最后,理解这个概念应该回答问题 2 和 3。基本上,这意味着每个对象或类将包含其自己的成员(提供数据)和方法(提供数据操作)。有了这个,您所做的就是将数据与作为对象的容器中的方法绑定。例如,让我们简称空调。AC 具有属性,例如:品牌、型号、isOn、温度。此外,它还封装了控制温度的方法:
tempDown()
和tempUp()
将温度降低和升高一度。您需要在这里了解的是,空调降低或升高温度的方法已经内置在其中。降低或升高温度的不是我们,当然我们确实按下了按钮,但这只会触发执行此操作的方法。功能本身构建在 AC 内部而不是外部,也就是说,操作 AC 的方法应该封装在 AC 内部。另一边的属性应该是private
概念上的。空调的属性,比如温度,属于空调本身,不应该是public
。将类的属性设置为public
因为它违背了封装概念。所以只有用属性封装的方法才能访问它们。如果您需要从类外部编辑对象的属性,您可以创建一个为您完成此操作的方法。方法是public
。
最后,关于getter 和 setter的使用,引起了很多争论,甚至有人将其描述为“邪恶”。如果您创建方法只是为了访问类属性,那么您不妨将它们设置为公共,并为自己省去额外的代码行。有些语言甚至有更好的方法来管理成员,比如在 Python 中使用属性。就像我之前说的,属性应该保留private
并且只能由对象本身编辑/访问,而不是从外部。做到这一点的方法是通过将操纵它们的方法。例如,假设您有一个具有属性的银行帐户:余额。如果要将属性设置为public
或有 getter/setter,这意味着任何人都可以从课堂外访问您的余额并将其更改为他们喜欢的任何值。另一方面,如果您有 attributes private
,则该类决定您可以通过方法进行哪种数据操作。一种仅打印余额的方法,或者仅在从另一个帐户中提取资金时才添加资金的方法,您甚至可以通过在每个方法中记录每个操作来添加额外的安全层。
您可以添加抽象(基本上通过接口分离代码的声明和实现)和重载。您可以在此处阅读更多信息:
推荐阅读
- android - viewPager 2 和 TabLayout 不再存在 Fragment
- macos - 如何从我的 Swift 项目中的 Next.js 项目运行 yarn dev?
- reactjs - 哪个是存储二进制图像和搜索的最佳选择:单独的弹性搜索 (ES) 或带有 ES 的二进制文件存储系统
- python - 无法用 seaborn 绘制时间序列
- google-play-console - 我的应用因 webView 上的捐赠而被拒绝
- php - 从 Wordpress 媒体和图像 url 永久链接中删除日期
- java - 如何从 java 类访问 kotlin 代码
- c++ - Eclipse IDE 象形文字
- css - Live Sass 编译器不工作,文件不知何故没有链接?
- vaticle-typedb - 如何解决在 localhost:48555 加载 Grakn 模式和数据的问题?