共有三个类 命名为A、B、C
他们的关系是A继承B,B有一个属性是C
public class ClassC {

public void print()
{
System.out.println("this is C");
}}
public class ClassB {

ClassC c;}public class ClassA extends ClassB{

public int a ;

public ClassA(int a)
{
this.a = a;
}

public static void main(String[] args) {

}}
问题:如何能够在A类中根据属性a的值动态地设置C类中print方法的行为?
比如如果a>0,在C的print方法前先输出"a为正数",再执行该方法;同理,若小于0,则先输出“a为负数”;真诚求教!

解决方案 »

  1.   

    c的print方法还能修改么,或者重载一个print?
      

  2.   

    在C类中新建一个A a属性,A类构建的时候,将自己set注入进去。
    日后C中的print方法就可以访问自己的a属性的a属性了。尽管可以实现,但是这个设计是不好的。
      

  3.   


    如果可以改C类的代码就没什么意思了 要求就是不能改C的代码 A/B类都可以改
      

  4.   

    代码如下:public class ClassA extends ClassB{
        public int a ;
        
        public ClassA(int a){
            this.a = a;
            c = new ClassC();
            this.c.setOwner(this);
        }
      
        public static void main(String[] args) {
            ClassA obj = new ClassA( 5 );
            obj.c.print();
        }
    }class ClassC {
        private ClassA owner;
        public void setOwner (ClassA o){
         owner = o;
        }
        public void print(){
            System.out.println("this is C");
            System.out.println("ClassA obj's attribute a is " + owner.a );
        }
    }class ClassB {
        ClassC c;
    }
      

  5.   

    必须要让C知道(引用)A对象,否则神仙才知道A对象中属性的值。
    不想修改C的代码也可以,
    用AOP。
      

  6.   

    静态代理都可以实现,如果只针对这一个例子,没有以后维护需要添加类的话
    写个静态的吧,动态的也好理解
    其实框架就是你这个框架,给B加个方法调用就行了public class ClassB {
        
        ClassC c;
        
        public void print()
       {
              System.out.println("执行前");
              if(a>0)  System.out.println("a为正数");
              else if(a<0) System.out.println("a为负数");
              c.print();
       }
    }
      

  7.   

    额 貌似看反了 A继承的B啊那就没办法知道a的值了
      

  8.   

    那就把A当代理吧 把刚才那个方法写在A中,ClassC c也继承下来了
      

  9.   

    终于用AOP搞定。楼主原先的ClassA/ClassB/ClassC三个类的代码都没有修改,增加了一个Aspect。
    所有代码如下:import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;public class ClassA extends ClassB{
        
        public int a ;
        
        public ClassA(){}
        
        public ClassA(int a){
            this.a = a;
            c = new ClassC();
        }
        
        public static void main(String[] args) {
            ClassA obj = new ClassA( 5 );
            obj.c.print();
        }}class ClassC {
        public void print(){
            System.out.println("this is C");
        }
    }class ClassB {
        ClassC c;
    }@Aspect
    class OwnerAwareAspect{
    private ClassA objA;

    @Pointcut("execution(* ClassC.print())")
    public void classCPrint() {} @Before("classCPrint()")
    public void printA() {
    if ( objA.a > 0) System.out.println("a是正数,值为:" + objA.a); 
    else System.out.println("a不是正数,值为:" + objA.a);
    } @Pointcut("initialization(ClassA.new(*)) && this (objA) " )
    public void newClassA(ClassA objA) {}

    @After("newClassA(objA)")
    public void afterNewClassA(ClassA objA){
    this.objA = objA;
    }

    }
      

  10.   


    public class ClassA extends ClassB{
        
        public int a ;
        
        public ClassA(){}
        
        public ClassA(int a){
            this.a = a;
            c = new ClassD(this);
        }
        
        public static void main(String[] args) {
            ClassA obj = new ClassA( 5 );
            obj.c.print();
        }}class ClassC {
        public void print(){
            System.out.println("this is C");
        }
    }class ClassB {
        ClassC c;
    }
    class ClassD
    {
        ClassA a;
        public ClassD(ClassA a){this.a=a;}
        public void print(){
            if ( a.a > 0) System.out.println("a是正数,a=:" + a.a); 
            else System.out.println("a不是正数,a=:" + a.a);
            Super.print();
        }
    }