为什么在Java中,超类的受保护成员是不可被另一个包中的间接子类访问的?我知道不同包中的直接子类可以访问超类的受保护成员.我认为任何子类都可以访问其继承的受保护成员.
编辑
抱歉新手错误,子类可以访问间接超类的受保护成员.
我在学校"学习"了C++,但有几件我不知道的事情,比如编译器可以优化的地方或内容,似乎我已经知道了,inline并且const可以提升一点......
如果性能是一个重要的东西(例如游戏编程),那么放置类属性不是public(private或protected)允许编译器制作更优化的代码吗?
因为我之前的所有老师都在说它更"安全"或"防止不想要或授权的类访问/行为",但最后,我想知道放置属性是否public可以限制范围,从而加固事物.
我不批评我的老师(我应该),但我所在的编程班不是很先进......
我有一个愚蠢的怀疑,但我想听听一些有关它的意见.
我有一个超类(MySuperClass),然后,我有70个继承自这个超类(Bean类)的类.
这个超类的目的是使用反射实现"toString"方法,这样,我确保所有这70个类都有toString方法.这70个类是bean,最终目的是记录类信息而不仅仅是类的实例.
然而,这不是我想要讨论的内容,我想听到的是你对超级类的受保护构造函数,有这个的好处和缺点有什么看法,不仅对于这个特定情况而且对于其他您可以想象的情况或场景.
问候,
费尔
我可以使用至少两种基本方法从子类访问受保护的类方法:
parent::myMethod();
$this->myMethod();
Run Code Online (Sandbox Code Playgroud)
如果我不需要在子类中重写它,在这种情况下我将不得不这样做:
function myMethod() {
...
parent::myMethod();
...
}
Run Code Online (Sandbox Code Playgroud)
这是最推荐的方式吗?我个人觉得使用parent :: myMethod()而不是$ this-> myMethod更舒服,因为第一个立即告诉我这个方法是继承的.但我不确定哪种方式在性能和最佳实践方面.
编辑:
检查一下,这是我的问题的真实案例.它使用CodeIgniter,但即使你不熟悉它,你也可能会得到它:
class Admin_Controller extends CI_Controller {
protected function validate_form($validation) {
$this->load->library('form_validation');
// This will validate the form sent against the validation rules group specified in $validation
if ($this->form_validation->run($validation) == false) {
throw new Exception('There are errors in the form');
}
}
}
class Articles extends Admin_Controller {
function save($id) {
$this->validate_form(strtolower(get_class($this));
// OR
parent::validate_form(strtolower(get_class($this));
// Other actions …Run Code Online (Sandbox Code Playgroud) 我正在提出一个关于protectedvs 的问题(protected internal因为我仍然不确定,并且无法控制它们).
任何帮助深表感谢.
// DLL 1
namespace Assembly1
{
class class1 : class2
{
static void Main()
{
new class1().Test();
}
private void Test()
{
Console.WriteLine(this.sample);
}
}
}
Run Code Online (Sandbox Code Playgroud)
// DLL 2
namespace Assembly2
{
public class class2
{
// protected string sample = "Test";
protected internal string sample = "Test";
//Same behavior when using protected and protected internal. Why ?
}
}
Run Code Online (Sandbox Code Playgroud)
我对这两行都有相同的行为.
// protected string sample = "Test";
protected internal string sample = …Run Code Online (Sandbox Code Playgroud) 为什么在Object类中的Java包含受保护的方法,如clone()和finalize(),如果使用或写所有的类继承对象的实例方法?
我想问一个关于CRTP的问题。假设您有一个基类和一个派生类,如下所示。有没有一种方法可以从派生类的成员函数之一(例如“ foo”)的基类中提取成员“ value”?
编译器告诉我:错误:在此范围内未声明“值”
#include <iostream>
template <class T, class Implementation>
class FooBase
{
protected:
void fooBase(void) {};
int value;
};
template <class T>
class Foo : public FooBase <T, Foo<T>>
{
friend FooBase <T, Foo<T>>;
public:
void foo()
{
std::cout << "Its own value is : " << value << std::endl;
}
};
int main ()
{
Foo <int> foo;
foo.foo();
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我在XCode中有以下C++代码,给出了两个我无法理解的错误:
#include <iostream>
class Buch{
public:
Buch (long int nummer = 0, char autor[25] = (char*)"", int jahr = 0, bool ausgel = false);
long int getNr();
int getJahr();
protected:
long int __nummer;
char __autor[25];
int __jahr;
bool __ausgel;
void setAusl(bool x);
bool getAusl();
};
class FachBuch : Buch {
public:
void setSWort(int sw);
int getSWort();
protected:
char __fach[15];
int __swort;
};
class UBuch : Buch {
public:
void setAlter(int a);
int getAlter();
protected:
int __kateg;
char __land[15];
private:
int …Run Code Online (Sandbox Code Playgroud) 在CoreJavaⅠ一书中,它说......
protected应谨慎使用关键字.如果您使用protected字段设置类,则如果要更改它,则必须通知所有使用此类的程序员.
我不明白.如果Son extends Father,并且Father已经改变,Son则没有受到影响.这样对吗?
我在许多讨论中都读到,有protected班级成员是坏人,我看到了原因.但是考虑到下面的例子,最优雅的方法是什么,const int age private并解决由此产生的问题?
#include <iostream>
class Animal
{
public:
Animal(const int age) : age(age) {}
void print_age() const { std::cout << age << std::endl; }
protected:
const int age;
};
class Dog : public Animal
{
public:
Dog(const int age) : Animal(age) {}
void bark() const
{
if (age >= 1)
std::cout << "Woof!" << std::endl;
else
std::cout << "(...)" << std::endl;
}
};
int main()
{
Dog dog(1);
dog.print_age();
dog.bark();
return 0;
}
Run Code Online (Sandbox Code Playgroud)