这是不好的OO编程?通过方法传递这一点

use*_*112 6 java oop design-patterns aggregation

好吧,假设我有一个类,X和X是与其他对象有聚合关系的东西.让假装X是一个足球场.

X满是观众.然而,每个观众对特定活动的行为不同.而不是IF语句,我希望不同的行为在观众类中,以便我可以使用动态绑定.

然而,问题在于观众执行的行为影响"足球场"类.所以我想把"这个"从足球场的课程,通过一种方法传递给观察者课程,以便观众班可以为足球场课程做些什么?

public class SoccerStadium{
    SpecatorInterface s = new Spectator();

    public void SpectatorBehaviour(){
        s.doSomething(this);
    }

    public void doSomethingthingBySpecator(){
    }
}

public class Spectator implements SpecatorInterface{
    public void doSomething(SoccerStadium s){
        s.doSomethingthingBySpecator();
    }
}
Run Code Online (Sandbox Code Playgroud)

我只想这样做,这样我就可以使用动态绑定并改变行为,Specator.doSomething()这样我可以将许多不同类型的SpectatorSuperClass作为传递给SoccerStadium的属性然后具有不同的行为.

编辑:如果我通过Spectator构造函数将体育场的引用传递给Specator,而不是传递this怎么办?

the*_*key 1

你的实现绝对没问题,我以前见过这种事情。是的,您可以通过将 Stadium 引用传递给 Spectator 构造函数来保留 Stadium 引用,这可能比每次需要时都发送引用更干净。

然而,我不太喜欢它;我更喜欢内部类。目前还不完全清楚你想要做什么,但类似这样的事情是可能的:

public class Outer {

private int someVariable=0;

public void someMethod(){
    ExtendsInner ei = new ExtendsInner();
    ei.innerMethod();
    System.out.println(someVariable);
}

private void anotherMethod(){
    someVariable++;
}

public abstract class Inner {
    public abstract void innerMethod();
}

public class ExtendsInner extends Inner{
    public void innerMethod(){
        anotherMethod();
        someVariable++;
    }
}

public static void main(String[] args){
    Outer o = new Outer();
    o.someMethod();
}
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,您必须将所有“观众”类放在另一个类,这可能会导致一个非常长的文件,从而导致丑陋的代码。

然而,我认为你绝对应该避免做这两件事,因为它肯定会让你的代码过于复杂。