java() 中的多重继承和受保护变量
Multiple inhetitance and protected variable in java()
正如我们在 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();
}
}
为此尝试使用组合(这里我们得到了中介模式)
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();
}
}
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
Foo
1
正如我们在 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();
}
}
为此尝试使用组合(这里我们得到了中介模式)
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();
}
}
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
Foo
1