有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java就是这样糟糕的OO编程吗?通过方法传递

好的,假设我有一个类,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();
    }
}

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

编辑:如果我通过观众构造器将体育场的引用传递给Specator,而不是传递this,该怎么办


共 (3) 个答案

  1. # 1 楼答案

    我认为将其用作参数没有问题。然而,我不喜欢new Spectator()类中硬编码的SoccerStadium调用。我相信你应该有一个带有createSpectator方法的工厂,它可以接收一个参数,指示你打算创建哪种类型的观众

  2. # 2 楼答案

    你的实现非常好,我以前见过这种情况。是的,你可以通过将体育场引用传递给观众构造器来保存它,这可能比每次需要时发送引用更干净

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

    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();
    }
    }
    

    不幸的是,您必须将所有的“旁观者”类放在另一个类的中,这可能会导致一个非常长的文件,从而产生难看的代码

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

  3. # 3 楼答案

    对我来说,这种双向循环关系是个坏消息。如果观众想去剧院呢

    我会让体育场成为观众安排的活动的订户,从而消除这种关系

    public class SoccerStadium
    {
        ISpectator s = new Spectator();
        public SoccerStadium()
        {
            s.DidSomething+=DoSomethingthingBySpecator;
        }
        public void SpectatorBehaviour()
        {
            s.DoSomething();
        }
        public void DoSomethingthingBySpecator(object sender,EventArgs e)
        {
            Console.WriteLine("spectator did something");
        }
    }
    public interface ISpectator
    {
        event EventHandler DidSomething;
        void DoSomething();
    }
    public class Spectator:ISpectator
    {
        public event EventHandler DidSomething;
        public void DoSomething()
        {
            var ev=DidSomething;
            if(ev!=null)
            {
                ev(this,EventArgs.Empty);
            }
        }
    }
    

    。。。所以观众现在有了一种与任何感兴趣的人交流的方式,但不需要知道任何事情