我正在编写一个trait应该指定clone返回a 的方法CloneResult,如下所示:
trait TraitWithClone extends Cloneable {
def clone: CloneResult
}
Run Code Online (Sandbox Code Playgroud)
这里的目的是收紧对这个界面有用java.lang.Object的clone()东西的返回类型.但是,当我尝试编译它时,我得到:
错误:在特征View2中重写方法克隆类型为()CloneResult; 类型为()java.lang.Object的类Object中的方法clone具有较弱的访问权限; 它应该是公开的; (注意在型性状视图2()CloneResult是抽象的,并且由具体的方法克隆在类型的类对象因此重写该方法克隆()java.lang.Object中)
public当Scala没有关键字时,我如何要求实现?我知道我能做到:
trait TraitWithClone extends Cloneable {
override def clone = cloneImpl
protected def cloneImpl: CloneResult
}
Run Code Online (Sandbox Code Playgroud)
......但这似乎是一个黑客.有什么建议?
在一个类friend中放置一个子句(即在protected块内而不是private块中)是否重要?
考虑您有以下代码:
public abstract class MenuItem
{
protected string m_Title;
protected int m_Level;
protected MenuItem m_ParentItem;
public event ChooseEventHandler m_Click;
protected MenuItem(string i_Title, int i_Level, MenuItem i_ParentItem)
{
m_Title = i_Title;
m_Level = i_Level;
m_ParentItem = i_ParentItem;
}
}
Run Code Online (Sandbox Code Playgroud)
和
public class ContainerItem : MenuItem
{
private List<MenuItem> m_SubMenuItems;
public ContainerItem(string i_Title, int i_Level, MenuItem i_ParentItem)
:base(i_Title, i_Level, i_ParentItem)
{
m_SubMenuItems = new List<MenuItem>();
}
public string GetListOfSubItems()
{
string subItemsListStr = string.Empty;
foreach (MenuItem item in m_SubMenuItems)
{
item.m_Title = …Run Code Online (Sandbox Code Playgroud) 给定一个具有一些受保护成员的类,并通过一个公共接口对其进行修改,通常什么时候可以直接访问受保护成员?我想到了一些具体的例子:
我不想公开这些属性,因为我不想公开地触摸它们。我的语法IDE语法高亮显示,我在访问受保护的成员时错了-谁在这里?
编辑 -在下面添加一个简单的示例:
class Complex:
def __init__(self, imaginary, base):
self._imaginary = imaginary
self._base = base
def __str__(self):
return "%fi + %f" % self._base, self._imaginary
def __add__(self, other):
return Complex(self._imaginary + other._imaginary, self._base + other._base)
Run Code Online (Sandbox Code Playgroud)
Pycharm 使用以下内容突出显示other._imaginary和other._base:
访问类的受保护成员_imaginary
我有一个基类,比如BassClass,有一些字段,我让它们受到保护,还有一些纯虚函数.然后派生类,比如说DerivedClass像class DerivedClass : public BassClass.DerivedClass不应该从BassClass继承受保护的字段吗?当我尝试编译DerivedClass时,编译器抱怨DerivedClass没有任何这些字段,这里有什么问题?谢谢
我有以下基类:
abstract class Base
{
public abstract object Var
{
get;
protected set;
}
}
Run Code Online (Sandbox Code Playgroud)
而这个派生类:
class Derived : Base
{
public override object Var
{
get {//code here
}
set {//code here -- I get error here!
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是我收到了这个错误:
覆盖'protected'继承成员'Var'时无法更改访问修饰符
我尝试在设置之前添加一个protected和private关键字,但它没有帮助.我该如何解决?
更新:
基类必须确保子类Var在创建时提供值.所以我需要在Base类中声明setter.
或者,我可以声明一个私有成员变量来执行此操作并删除setter,但这不是这里讨论的选项.
给出示例代码:
class Base {
public:
bool pub;
protected:
bool prot;
};
class Derived : private Base {
friend class MyFriend;
};
class MyFriend {
Derived _derived;
void test() {
// Does standard provide me access to _derived.pub and _derived.prot?
cout << "Am I allowed access to this: " << _derived.pub
<< " and this: " << _derived.prot;
}
};
Run Code Online (Sandbox Code Playgroud)
做朋友会给我所有的访问权限,我会得到好像我是班级中的一员,我是他的朋友吗?换句话说,由于我是朋友,我可以获得私人继承的基类的受保护和公共成员吗?
我想就此进行一些讨论,但我无法推断出我案例的答案.仍然需要帮助.
这是我的代码:
package JustRandomPackage;
public class YetAnotherClass{
protected int variable = 5;
}
Run Code Online (Sandbox Code Playgroud)
package FirstChapter;
import JustRandomPackage.*;
public class ATypeNameProgram extends YetAnotherClass{
public static void main(String[] args) {
YetAnotherClass bill = new YetAnotherClass();
System.out.println(bill.variable); // error: YetAnotherClass.variable is not visible
}
}
Run Code Online (Sandbox Code Playgroud)
之后的一些定义,上面的例子似乎令人困惑:
1. Subclass is a class that extends another class.
2. Class members declared as protected can be accessed from
the classes in the same package as well as classes in other packages
that are subclasses of the …Run Code Online (Sandbox Code Playgroud) 我正在使用的Java库类声明
protected getPage(): Page { ... }
Run Code Online (Sandbox Code Playgroud)
现在我想帮助Scala mixin添加我经常使用的功能.我不想扩展类,因为Java类有不同的子类我想在不同的地方扩展.问题是,如果我getPage()在我的mixin中使用trait,我会收到此错误:
实现限制:trait
MyMixin访问getPage具体特征方法中的受保护方法.
有没有一个解决方案如何让它工作,而不影响我的子类?为什么会有这种限制?
到目前为止,我提出了一个解决方法:我将特征中的方法覆盖为
override def getPage(): Page = super.getPage();
Run Code Online (Sandbox Code Playgroud)
这似乎有效,但我并不完全满意.幸运的是,我不需要getPage()在我的子类中覆盖,但是如果我需要,我将获得相同方法的两个覆盖,并且这种解决方法将无法工作.
我在Java中有以下代码
public class First {
protected int z;
First()
{
System.out.append("First const");
}
}
class Second extends First {
private int b;
protected int a;
}
class Test {
/**
* @param args the command line arguments
*/
int a=0;
public static void main(String[] args) {
// TODO code application logic here
First t=new Second();
t.z=10; work fine
First x=new First();
x.z=1; // works fine
}
}
Run Code Online (Sandbox Code Playgroud)
所以我可以z通过创建base类的对象来访问
C#
class A
{
protected int x = …Run Code Online (Sandbox Code Playgroud)