标签: access-specifier

是否可以隐藏或降低对Java中的继承方法的访问?

我有一个类结构,我希望基类中的某些方法可以从直接从基类派生的类中访问,但不能从派生类派生的类中访问.根据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)

有没有办法实现这个目标?

编辑解释我为什么要这样做:

在这种情况下,类结构是数据处理和导入结构.它读入并解析充满表格数据的文本文件,然后将它们存储在数据库中.

基类是管理数据库处理部分的基表类.其中包含了相当多的功能,这些功能对于所有表类型都是通用的 - 因为一旦它们在数据库中,它们就变得统一.

中间类特定于要解析的文件中的表类型,并具有表解析和导入逻辑.它需要访问一些基类的数据库访问函数.

顶级类特定于表,并且只是以父类可以理解的方式初始化表的布局.此外,基类的用户不需要查看或访问中产阶级所执行的数据库特定功能.本质上,我想将这些函数仅显示在基类之上的一个级别而不是其他人.

我问,因为虽然我发布的代码是非法的,但可能还有其他方法可以实现同样的目的.我问是否有.

也许隐藏是错误的方式来表达这一点 - 我真正需要做的是将一些应该是基类私有的功能暴露给层次结构中一级的类.隐藏会实现这一点 - 但我可以看到隐藏是一个问题.还有另一种方法吗?

java inheritance overriding access-specifier

14
推荐指数
4
解决办法
2万
查看次数

为什么允许通过基类的指针调用派生类的私有虚方法?

# 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().我知道它是如何工作的,但为什么允许这个代码呢?

c++ virtual inheritance access-specifier

13
推荐指数
1
解决办法
2545
查看次数

如何将方法动态定义为私有?

这似乎不起作用:

class Test
  private

  define_method :private_method do 
    "uh!"
  end
end

puts Test.new.private_method
Run Code Online (Sandbox Code Playgroud)

ruby methods metaprogramming access-specifier

12
推荐指数
3
解决办法
7080
查看次数

`public`访问限定符和`const`ness.`-Wuninitialized`

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(显然是因为访问限定符,但逻辑是什么?).

c++ warnings member access-specifier

12
推荐指数
1
解决办法
188
查看次数

11
推荐指数
1
解决办法
2751
查看次数

11
推荐指数
1
解决办法
3711
查看次数

为什么在显式实例化中不恰当地访问私有部分是合法的?

为什么允许这样做:

//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
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)

c++ templates private access-specifier language-lawyer

11
推荐指数
1
解决办法
353
查看次数

我们应该何时考虑使用私人或受保护?

只是想知道,我们何时应该使用privateprotected模型中的某些方法?

有时候,我不能没有在打扰我的组的方法private,也没有protected.我只是保持原样.但我知道这一定是一种不好的做法,否则这两个分组将不会在编程中创建.

谢谢.

ruby ruby-on-rails access-specifier

10
推荐指数
1
解决办法
4251
查看次数

Java中的公共内部类和私有内部类

我正在阅读Java编程的介绍,它没有关于这个主题的很好的解释,它让我想知道为什么有人在java中使用私有内部类而不是使用公共内部类.

它们都只能由外层使用.

java inner-classes access-specifier

10
推荐指数
1
解决办法
9165
查看次数

在Visual Studio Express中访问说明符后缩进问题

我正在使用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)

c++ class indentation access-specifier visual-studio

10
推荐指数
1
解决办法
553
查看次数