求教一个类的设计问题

luckygino 2011-07-28 10:26:23
共有三个类 命名为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为负数”;

真诚求教!
...全文
158 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
小赖赖 2011-07-29
  • 打赏
  • 举报
回复

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();
}
}
magong 2011-07-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 luckygino 的回复:]

没说清楚,不能改变C类的代码!
[/Quote]
终于用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;
}

}
luckygino 2011-07-29
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 magong 的回复:]
引用 9 楼 luckygino 的回复:

没说清楚,不能改变C类的代码!

终于用AOP搞定。楼主原先的ClassA/ClassB/ClassC三个类的代码都没有修改,增加了一个Aspect。
所有代码如下:

Java code

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annot……
[/Quote]

嗯,貌似能实现功能了。
luckygino 2011-07-29
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 skyparty 的回复:]

Java code

public class ClassA extends ClassB{

public int a ;

public ClassA(){}

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

publ……
[/Quote]

这个和改写C代码没有什么区别吧。。。
aotian16 2011-07-29
  • 打赏
  • 举报
回复
完全看不懂啊, 谁写个教程吧
uastation 2011-07-29
  • 打赏
  • 举报
回复
围观..
桃园闲人 2011-07-29
  • 打赏
  • 举报
回复
观望。。。。。。。。。。。
阳明 to life 2011-07-28
  • 打赏
  • 举报
回复
那就把A当代理吧 把刚才那个方法写在A中,ClassC c也继承下来了
阳明 to life 2011-07-28
  • 打赏
  • 举报
回复
额 貌似看反了 A继承的B啊。。。那就没办法知道a的值了
luckygino 2011-07-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 magong 的回复:]

代码如下:
Java code

public class ClassA extends ClassB{
public int a ;

public ClassA(int a){
this.a = a;
c = new ClassC();
this.c.setOwner(this);
}

publ……
[/Quote]

没说清楚,不能改变C类的代码!
阳明 to life 2011-07-28
  • 打赏
  • 举报
回复
静态代理都可以实现,如果只针对这一个例子,没有以后维护需要添加类的话
写个静态的吧,动态的也好理解
其实框架就是你这个框架,给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();
}
}
magong 2011-07-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 luckygino 的回复:]

如果可以改C类的代码就没什么意思了 要求就是不能改C的代码 A/B类都可以改
[/Quote]
必须要让C知道(引用)A对象,否则神仙才知道A对象中属性的值。
不想修改C的代码也可以,
用AOP。
magong 2011-07-28
  • 打赏
  • 举报
回复
代码如下:

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;
}
luckygino 2011-07-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhouyuqwert 的回复:]

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

不能使用C类的代码 动态代理可以实现功能吗?写个代码框架试试看
luckygino 2011-07-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 magong 的回复:]

在C类中新建一个A a属性,A类构建的时候,将自己set注入进去。
日后C中的print方法就可以访问自己的a属性的a属性了。

尽管可以实现,但是这个设计是不好的。
[/Quote]

如果可以改C类的代码就没什么意思了 要求就是不能改C的代码 A/B类都可以改
magong 2011-07-28
  • 打赏
  • 举报
回复
在C类中新建一个A a属性,A类构建的时候,将自己set注入进去。
日后C中的print方法就可以访问自己的a属性的a属性了。

尽管可以实现,但是这个设计是不好的。
阳明 to life 2011-07-28
  • 打赏
  • 举报
回复
噢 对了 还有动态代理
让B做代理类就可以了
阳明 to life 2011-07-28
  • 打赏
  • 举报
回复
c的print方法还能修改么,或者重载一个print?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧