我有一个类结构,我希望基类中的某些方法可以从直接从基类派生的类中访问,但不能从派生类派生的类中访问.根据Java语言规范,可以覆盖继承方法的访问规范,使其更公开,但不是更私密.例如,这是我需要做的事情的要点,但是非法的:
// Defines myMethod
public class Base {
protected void myMethod() {}
}
// Uses myMethod and then hides it.
public class DerivedOne extends Base {
@Override
private void myMethod();
}
// can't access myMethod.
public class DerivedTwo extends DerivedOne {
}
Run Code Online (Sandbox Code Playgroud)
有没有办法实现这个目标?
编辑解释我为什么要这样做:
在这种情况下,类结构是数据处理和导入结构.它读入并解析充满表格数据的文本文件,然后将它们存储在数据库中.
基类是管理数据库处理部分的基表类.其中包含了相当多的功能,这些功能对于所有表类型都是通用的 - 因为一旦它们在数据库中,它们就变得统一.
中间类特定于要解析的文件中的表类型,并具有表解析和导入逻辑.它需要访问一些基类的数据库访问函数.
顶级类特定于表,并且只是以父类可以理解的方式初始化表的布局.此外,基类的用户不需要查看或访问中产阶级所执行的数据库特定功能.本质上,我想将这些函数仅显示在基类之上的一个级别而不是其他人.
我问,因为虽然我发布的代码是非法的,但可能还有其他方法可以实现同样的目的.我问是否有.
也许隐藏是错误的方式来表达这一点 - 我真正需要做的是将一些应该是基类私有的功能暴露给层次结构中一级的类.隐藏会实现这一点 - 但我可以看到隐藏是一个问题.还有另一种方法吗?
# include <iostream>
using namespace std;
class A
{
public:
virtual void f()
{
cout << "A::f()" << endl;
}
};
class B:public A
{
private:
virtual void f()
{
cout << "B::f()" << endl;
}
};
int main()
{
A *ptr = new B;
ptr->f();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此代码正常工作并打印B :: f().我知道它是如何工作的,但为什么允许这个代码呢?
这似乎不起作用:
class Test
private
define_method :private_method do
"uh!"
end
end
puts Test.new.private_method
Run Code Online (Sandbox Code Playgroud) class Foo
{
public:
const int x;
};
class Bar
{
private:
const int x;
};
Run Code Online (Sandbox Code Playgroud)
输出:
test.cpp:10:13: warning: non-static const member ‘const int Bar::x’ in class without a constructor [-Wuninitialized]
Run Code Online (Sandbox Code Playgroud)
为什么会Bar产生警告但不产生警告Foo(显然是因为访问限定符,但逻辑是什么?).
在红宝石上,include私有的原因是什么,而Object#extend公众呢?
为什么允许这样做:
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
template<typename T>
struct invisible
{
static typename T::type value;
};
template<typename T>
typename T::type invisible<T>::value;
//////////////////////////////////////////////////////////////////////////
template<typename T, typename T::type P>
class construct_invisible
{
construct_invisible(){ invisible<T>::value = P; }
static const construct_invisible instance;
};
template<typename T, typename T::type P>
const construct_invisible<T, P> construct_invisible<T, P>::instance;
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
class A
{
public:
A(int x) : m_X(x){}
private:
int m_X;
};
//////////////////////////////////////////////////////////////////////////
struct A_x{ typedef int A::*type; };
template class construct_invisible<A_x, &A::m_X>;// <---- WHY DOES `&A::m_X` WORK HERE?
//////////////////////////////////////////////////////////////////////////
int …Run Code Online (Sandbox Code Playgroud) 只是想知道,我们何时应该使用private或protected模型中的某些方法?
有时候,我不能没有在打扰我的组的方法private,也没有protected.我只是保持原样.但我知道这一定是一种不好的做法,否则这两个分组将不会在编程中创建.
谢谢.
我正在阅读Java编程的介绍,它没有关于这个主题的很好的解释,它让我想知道为什么有人在java中使用私有内部类而不是使用公共内部类.
它们都只能由外层使用.
我正在使用Visual Studio Express 2013
在我使用访问说明符后,我希望Visual Studio自动缩进我的成员,比我的访问说明符更多4个空格; 但相反,它使成员与访问说明符保持一致.有没有办法来解决这个问题?
示例:这是做什么的:
class MyClass {
public:
int myInt;
};
Run Code Online (Sandbox Code Playgroud)
这就是我要的:
class MyClass {
public:
int myInt;
};
Run Code Online (Sandbox Code Playgroud) access-specifier ×10
c++ ×4
ruby ×4
inheritance ×2
java ×2
class ×1
indentation ×1
member ×1
methods ×1
overriding ×1
private ×1
templates ×1
virtual ×1
warnings ×1