我很难找到我需要的东西,并弄清楚如何要求它所以请考虑一下:
public class Environment {
int x = 0;
int y = 0;
Operations op = new Operations();
public Environment(){
Operations.changeSuper();
}
}
和
public class Operations extends Environment {
public void changeSuper(){
x++;
y--;
}
}
这是我已经尝试过的简单表示。但是我不认为初始化环境中的操作是正确的,因为它会导致构造函数循环。但是,如果我不这样做,那么当我尝试调用changeSuper()时,我会得到空指针。
这是使用扩展的正确方法吗?是否有更好的方法从类文件中抽象出方法。
长话短说,我想从类文件中移出方法,但仍允许它们影响它的局部变量
答案 0 :(得分:2)
Environment
不是Operations
..所以不。
听起来你需要合成。你应该让你的课程Operation
不是Operations
。
所以有这样的事情:
public class Environment {
int x = 0;
int y = 0;
Operation op ;
public Environment(){
op=new Operation(this);
}
public void changeEnvironment() {}
public void incrementX(){}
public void incrementY() {}
}
和
public class Operation {
Environment e;
public Operation(Environment e){
this.e = e;
e.incrementX();
e.decrementY();
}
public void changeEnvironment()
{
e.changeEnvironment() ;
}
}
如果更改仅在Environment
中完成,那么它可以使维护更容易,同时也可以保留封装。
答案 1 :(得分:1)
您不能通过继承在超类中引用子类Operations
。相反,将Environment
设为抽象类,并将changeSuper
定义为抽象方法,如下所示:
public abstract class Environment {
int x = 0;
int y = 0;
public abstract void changeSuper();
public Environment(){
changeSuper();
}
}
然后定义Operations
类以扩展Environment
并实施changeSuper()
方法,如下所示:
public class Operations extends Environment {
@Override
public void changeSuper(){
x++;
y--;
}
}
现在,如果您在main
类中创建Operations
方法:
public static void main(String[] args) {
Environment env = new Operations();
System.out.println("x="+env.x+"&y="+env.y);//<- it will print x=-1&y=-1
}
答案 2 :(得分:0)
我相信changeSuper应该是静态的。
答案 3 :(得分:0)
我认为你不希望操作同时
环境的子类型和
环境
如果Environment是操作的超类型 - 它们将自动共享非私有实例变量(无需一个调用另一个)。 如果不是超类型,则通过直接访问实例变量来破坏封装是不好的做法。
试试这个:
public class Environment {
int x = 0;
int y = 0;
public Environment(){
}
}
and:
public class Operations extends Environment {
public void changeState(){
x++;
y--;
}
}
and:
public class MasterControl {
Operations op = new Operations();
op.changeState();
}
<强>替代地强>
public class Environment {
int x = 0;
int y = 0;
Operations op = new Operations();
public Environment(){
op.changeState();
}
public int getX() {return x;}
public setX(int x) {this.x = x;}
public int getY() {return y;}
public setY(int x) {this.y = y;}
}
和
public class Operations {
public void changeState(Environment env){
env.setX(env.getX+1);
env.setY(env.getY-1);
}
}
此处环境负责存储环境状态并使其可用于其他对象。这里,Operations正在进行专业操作以修改环境状态。
凯?