我的代码如下:
class A
private
def p_method
puts "I'm a private method from A"
end
end
class B < A
def some_method
p_method
end
end
b = B.new
b.p_method # => Error: Private method can not be called
b.some_method # => I'm a private method from A
Run Code Online (Sandbox Code Playgroud)
b.some_method
调用在类中定义的私有方法A
.如何在继承它的类中访问私有方法?在所有面向对象的编程语言中,这种行为是否相同?Ruby如何封装?
我试图弄清楚在C#中命名私有方法和私有静态方法的最聪明方法是什么.
背景:我知道私有成员的最佳做法是下划线前缀+ camelcase.你可以跟我争论这个,但相信我,我已经看到了遵循这个惯例的核心专业人士的足够代码,这是熟练的行业标准.
我也知道pascal案例是公共方法的行业标准.但我已经看到测试样式命名(即method_must_return_false_occasionally)与pascal case,camelcase和underscore-prefix + camelcase的组合,用于私有和私有静态方法.
但是,在C#中私有和私有静态方法命名的最佳实践风格是什么?
如果某些私有方法使用某些样式而不是其他方法,我可以理解,只需解释一下.
谢谢阅读.
例如,在许多框架中,内部函数变量用作私有变量
Raphael = (function(){
var _private = function(a,b) {return a+b;};
var _public = function(a) {return _private(a,a);}
var object = {mult2:_public};
return object;
})();
Run Code Online (Sandbox Code Playgroud)
在这里,我们无法从全局命名空间中访问名为的变量private
,因为它是第一行中匿名函数的内部变量.
有时这个函数包含一个大的Javascript框架,因此它不会污染全局命名空间.
我需要在Raphael
内部单元测试一些对象用法(在上面的例子中,我希望对对象运行单元测试private
).我该如何测试它们?
编辑:我收到了关于应该测试公共接口的单元测试的评论.
我来指一个用例.我正在写一个名为的库Raphael
.该库应该只向全局命名空间添加一个名称,仅此而已.这是Javascript的特殊要求,因为Javascript没有名称空间.
假设Raphael
使用链表.如果Javascript有包的概念,我会这样做
require 'linked_list'
Raphael = (function(){/* use linked list */})();
Run Code Online (Sandbox Code Playgroud)
但是,Javascript不允许我以任何不会使用链表对象污染全局范围的方式执行此操作!因此,我必须内联linked_list
到Raphael的本地范围:
Raphael = (function(){
/* implement linked list */
var linked_list = function(){/*implementation*/};
})();
Run Code Online (Sandbox Code Playgroud)
现在我想测试linked_list
实现.
Objective-c中私有方法的最佳实践方法是什么?这是一种仅用于将类作为辅助方法的方法.
特别是我不清楚的是:
谢谢
我在C中工作,并且有一些我不想成为全局的变量,但我确实想要获取和设置它们的方法,可以在文件外部访问"Globaly".我习惯在Java中这样做,但C以这种方式非常不同.基本上我正在寻找遵循这个伪代码的东西,但我无法找到任何可以看到的示例.
main.c
#include data.h
set(b);
datalog.c
#include data.h
get(b);
data.c
private int c;
set(b){
c = b;
}
get(c){
return c;
}
Run Code Online (Sandbox Code Playgroud) 我正在使用Damian Conway的"由内而外"的对象,如他所描述的那本精彩的书Perl Best Practices,用于在我的客户端构建面向对象的安全系统接口.我想在我的模块中使用内部帮助器方法,我通常将其指定为"_some_method".但是,这似乎打破了封装,因为它们可以通过包名直接调用.有没有办法让这些方法真正私密?举个例子,
use SOD::MyOOInterface;
my $instance1 = SOD::MyOOInterface->new();
$instance1->_some_method; #this produces an error:
SOD::MyOOInterface::_some_method; # this results in a
# successful method call
Run Code Online (Sandbox Code Playgroud)
显然我不希望_some_method的直接调用成功.有什么方法可以保证吗?
根据在Objective-C中为类定义私有方法的最佳方法,我一直在类扩展中声明私有方法.
但是,我刚刚意识到,在Xcode 4中,如果我完全忽略私有方法的声明并且只是实现它,那么应用程序将编译并运行而不会发出警告或错误.
那么,我是否应该在类扩展中声明私有方法呢?
为什么我们必须要声明方法呢?在Java中,你没有......在Ruby中也没有.
test_module.rb
module MyModule
def module_func_a
puts "module_func_a invoked"
private_b
end
module_function :module_func_a
private
def private_b
puts "private_b invoked"
end
end
class MyClass
include MyModule
def test_module
module_func_a
end
end
Run Code Online (Sandbox Code Playgroud)
从类调用模块函数
c = MyClass.new
c.test_module
Run Code Online (Sandbox Code Playgroud)
输出1:
$ ruby test_module.rb
module_func_a invoked
private_b invoked
Run Code Online (Sandbox Code Playgroud)
在类方法样式中调用模块上的模块函数
ma = MyModule.module_func_a
Run Code Online (Sandbox Code Playgroud)
输出2:
module_func_a invoked
test_module.rb:5:in `module_func_a': undefined local variable or method `private_b' for MyModule:Module (NameError)
from test_module.rb:31
Run Code Online (Sandbox Code Playgroud)
从输出1和输出2中可以看出,当将模块包含在类中时,当从模块函数调用模块的私有方法时,如果在类方法样式中直接调用模块上的模块函数,则不会出现问题找不到模块函数调用的模块私有方法.
任何人都可以让我理解上面行为背后的原因,是否可以在类方法样式中调用模块函数(进而调用模块的私有方法)?如果可能的话,我的代码中需要做哪些修正才能做同样的事情?
我想SomeClass
从该类的外部调用该类的私有函数:
class SomeClass {
private fun somePrivateFunction() {
//...
}
private fun somePrivateFunctionWithParams(text: String) {
//...
}
}
Run Code Online (Sandbox Code Playgroud)
在代码中的某个地方我引用了SomeClass
对象:
val someClass = SomeClass()
// how can I call the private function `somePrivateFunction()` from here?
// how can I call the private function `somePrivateFunctionWithParams("some text")` from? here
Run Code Online (Sandbox Code Playgroud)
如何从类外部调用 Kotlin 中带参数和不带参数的私有函数?
我正在 vue 项目中编写带有私有属性/方法的 ES6 类。并使用 eslint 对代码进行 lint。下面是示例类:
class TestClass {
constructor(value) {
this.#privateProperty = value
this.#privateMethod(this.#privateProperty)
}
#privateProperty = undefined
// lint error raised at below line
#privateMethod(value) {
this.e = value
console.log(this.e)
}
}
Run Code Online (Sandbox Code Playgroud)
vue 项目由@vue/cli 4.1.2 创建。以下是有关该项目的一些配置:
babel.config.js:
module.exports = {
presets: ['@vue/cli-plugin-babel/preset'],
plugins: [
['@babel/plugin-proposal-class-properties', { loose: true }],
['@babel/plugin-proposal-private-methods', { loose: true }]
]
}
Run Code Online (Sandbox Code Playgroud)
包.json:
{
"name": "demo-project",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"test:unit": "vue-cli-service test:unit",
"lint": …
Run Code Online (Sandbox Code Playgroud) private-methods ×10
javascript ×2
objective-c ×2
ruby ×2
c ×1
c# ×1
categories ×1
es6-class ×1
eslint ×1
iphone ×1
kotlin ×1
methods ×1
module ×1
oop ×1
perl ×1
private ×1
reflection ×1
unit-testing ×1