有没有办法在cpp文件中隐藏C++类的私有数据成员远离其用户?我认为私有成员是实现的一部分,在头文件中声明它们似乎有些倒退.
这是一个相当基本的OO问题,但是一段时间以来一直困扰着我.
我倾向于避免使用'private'可见性修饰符来支持我的字段和方法protected.
这是因为,一般来说,我没有看到在基类和子类之间隐藏实现的任何用法,除非我想为我的类的扩展设置特定的指导(即在框架中).对于大多数情况,我认为试图限制我的课程将由我或其他用户扩展是不利的.
但是,对于大多数人来说,private修饰符通常是定义非公共字段/方法时的默认选择.
那么,你可以列出用例private吗?总是使用私有的主要原因是什么?或者您是否也认为它过度使用?
情况如下:
我在github.com上有我的开源应用程序的公共存储库.但是,现在我想编写一些不公开的特定代码(我可能会在我的应用程序的商业版本中使用它).
我想我可以使用相同的存储库,并且我会在我的git存储库中创建一个"私有"分支,我不会推送它.
但是,错误发生了.有没有办法禁止git将分支推送到远程服务器?
如果有更好的方法来处理这种情况,我当然欢迎任何建议.
"作为添加对Lambda表达式的支持的努力的一部分,简单地考虑将接口中的私有方法支持包含在Java SE 8中,但是为了更好地关注Java SE 8的更高优先级任务而被撤回.现在提议支持私有接口方法,从而使接口的非抽象方法能够在它们之间共享代码."
所以说http://openjdk.java.net/jeps/213的规范, 并在错误报告https://bugs.openjdk.java.net/browse/JDK-8071453中说.
但是,即使有上面给出的简短解释,我也无法想到任何必要的用例.我可以问一个例子,"私有接口方法"在代码方面是否有用?
编辑:所以答案是,由于Java 8中的接口添加了默认实现,可能存在默认实现使用相同代码库的情况.
例如,
public interface MyInterface {
default void initializeMyClass(MyClass myClass, Params params) {
//do magical things in 100 lines of code to initialize myClass for example
}
default MyClass createMyClass(Params params) {
MyClass myClass = new MyClass();
initializeMyClass(myClass, params);
return myClass;
}
default MyClass createMyClass() {
MyClass myClass = new MyClass();
initializeMyClass(myClass, null);
return myClass;
}
}
Run Code Online (Sandbox Code Playgroud)
愚蠢的例子,我知道.但是,让我们说我们想要initializeMyClass(MyClass, Params)在两种方法中使用.但是,如果我们这样做(默认方法),那么initializeMyClass(MyClass, Params)将成为公共接口的一部分!为了防止这种情况发生,我们只能将整个代码保留initializeMyClass(MyClass, Params) …
我想使用GoogleTest测试一些私有方法.
class Foo
{
private:
int bar(...)
}
Run Code Online (Sandbox Code Playgroud)
GoogleTest允许使用两种方法.
选项1
使用FRIEND_TEST:
class Foo
{
private:
FRIEND_TEST(Foo, barReturnsZero);
int bar(...);
}
TEST(Foo, barReturnsZero)
{
Foo foo;
EXPECT_EQ(foo.bar(...), 0);
}
Run Code Online (Sandbox Code Playgroud)
这意味着在生产源文件中包含"gtest/gtest.h".
方案2
将测试夹具声明为类的朋友并在夹具中定义访问器:
class Foo
{
friend class FooTest;
private:
int bar(...);
}
class FooTest : public ::testing::Test
{
protected:
int bar(...) { foo.bar(...); }
private:
Foo foo;
}
TEST_F(FooTest, barReturnsZero)
{
EXPECT_EQ(bar(...), 0);
}
Run Code Online (Sandbox Code Playgroud)
方案3
该PIMPL方法.
有关详细信息:Google测试:高级指南.
有没有其他方法来测试私有方法?每种选择有哪些优缺点?
我宣布一个字段:
private static final String filename = "filename.txt";
Run Code Online (Sandbox Code Playgroud)
首先,private static final物质的顺序是什么?如果没有,是否有标准接受的序列或惯例?
其次,filename在我的应用程序中是固定的.这是最好的存储价值吗?
默认情况下,ActiveRecord从相应的数据库表中获取所有字段,并为所有字段创建公共属性.
我认为不公开模型中的所有属性是合理的.更重要的是,暴露出用于内部使用的属性会使模型的界面混乱,并违反封装原则.
那么,有没有办法从字面上制作一些属性private?
或者,也许我应该转向其他ORM?
是否可以使用Java反射从另一个类实例化私有内部类.例如,如果我采用此代码
public class Main {
public static void main(String[] args) {}
}
class OtherClass {
private class Test {}
}
Run Code Online (Sandbox Code Playgroud)
是否可以从类main中的main方法实例化并获得对Test的访问权限.
在C++中,您可以通过在子类中将其声明为私有来禁用父类中的函数.如何在Python中完成?IE如何从子公共接口隐藏父功能?
private ×10
c++ ×3
class ×3
java ×3
interface ×2
oop ×2
protected ×2
activerecord ×1
branch ×1
final ×1
git ×1
googletest ×1
inheritance ×1
java-9 ×1
python ×1
reflection ×1
static ×1
unit-testing ×1
visibility ×1