【问题标题】:Multiple inhetitance and protected variable in java()java() 中的多重继承和受保护变量
【发布时间】:2017-04-13 08:09:09
【问题描述】:

我们知道在Java中我们不能在接口中拥有多重继承和受保护的变量,那么我该如何实现这段代码呢?

Bar.java

public class Bar {
    protected int  a = 0;
    public void increaseA() {
        a++;
    }
    public void printA() {
        System.out.println(a);
    }
}

Foo.java

public class Foo extends Bar, FooBar {
    @Override
    public void printClassName() {
        printClassName();
        System.out.println("Foo");
    }
}

FooBar.java

public class FooBar {
    void printClassName(){
        System.out.println("FooBar");
    }
}

Main.java

public class Main {
    public static void main(String[] args) {
        Foo foo = new Foo();
        FooBar fooBar = foo;
        foo.printClassName();
        Bar bar = foo;
        bar.increaseA();
        bar.printA();
    }
}

【问题讨论】:

  • 您可以在 Java 8 中使用 interfacedefault 方法。
  • @PeterLawrey 我应该如何处理“ Protected in a = 0”
  • a 留在Bar 中的位置
  • @PeterLawrey 请看我的代码(答案)我已经实现了它,但不完全像你说的那样
  • 要让它工作,你必须改变它。如果你想让它工作,我建议你使用FooBar 的接口。

标签: java interface multiple-inheritance


【解决方案1】:

为此尝试使用组合(这里我们得到了中介模式)

  public interface BarInterface {
    void increaseA();

    void printA();
  }

  public interface FooBarInterface {
    void printClassName();
  }

  public class FooBar implements FooBarInterface {
    @Override
    public void printClassName() {
      System.out.println("FooBar");
    }
  }

  public class Bar implements BarInterface {
    protected int a = 0;

    public void increaseA() {
      a++;
    }

    public void printA() {
      System.out.println(a);
    }
  }

  public class Foo implements BarInterface, FooBarInterface {

    private final BarInterface bar;
    private final FooBarInterface fooBar;

    public Foo(Bar bar, FooBar fooBar) {
      this.bar = bar;
      this.fooBar = fooBar;
    }

    @Override
    public void printClassName() {
      fooBar.printClassName();
    }

    @Override
    public void increaseA() {
      bar.increaseA();
    }

    @Override
    public void printA() {
      bar.printA();
    }
  }

【讨论】:

    【解决方案2】:
    abstract class Bar {
        protected  int  a = 0;
        public  void increaseA() {
            a++;
        }
        public void printA() {
            System.out.println(a);
        }
    
    
    }
    
    interface FooBar {
        default void printClassName(){
            System.out.println("FooBar");
        }
    }
    
    class Foo extends Bar implements FooBar {
        @Override
        public void printClassName() {
            FooBar.super.printClassName();
            System.out.println("Foo");
        }
    }
    
    
    
    public class Q4 {
        public static void main(String[] args) {
            Foo foo = new Foo();
            FooBar fooBar = foo;
            foo.printClassName();
            Bar bar = foo;
            bar.increaseA();
            bar.printA();
        }
    }
    

    所以输出是

    FooBar

    1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-01
      • 1970-01-01
      • 2016-09-04
      • 2016-01-01
      相关资源
      最近更新 更多