黑马程序员技术交流社区

标题: 多态中实例应用中,进行抽取后,如何单独调用子类的某..... [打印本页]

作者: 江夷    时间: 2014-4-26 13:15
标题: 多态中实例应用中,进行抽取后,如何单独调用子类的某.....
    /*基础班:学习 睡觉

高级班:学习 睡觉

将这两类事物进行抽取   
*/
abstract class Student
{
        public abstract void study();
        public void sleep()
        {
                System.out.println("睡觉");
        }
}

class DoStudent
{
        public void doThings(Student x)
        {
                x.study();
                x.sleep();
       
        }
}

class BasStudent extends Student
{
        public void study()
        {
                System.out.println("BAS Study");
        }
        public void sleep()
        {
                System.out.println("BAS Sleep");
        }
}
class AdvStudent extends Student
{
        public void study()
        {
                System.out.println("ADV Study");
        }
        public void sleep()
        {
                System.out.println("ADV Sleep");
        }
}


class  DuoTaiDemo3_1
{
        public static void main(String[] args)
        {
       
                DoStudent dt =new DoStudent();
                dt.doThings(new BasStudent());
                dt.doThings(new AdvStudent());
                //问题,在多态情况下,当我只想调用子类对象的某一个方法时如何操作
        }
}
//问题:在这种情况下,当我只想调用子类对象的某一个方法时,
              即只想调用子类对象的sleep(); 或者只调用study();
              如何操作,




作者: 轻语。    时间: 2014-4-26 13:27
一点想法,这个代码。 DoStudent中调用了两个方法。你又说只想调用一个。感觉,实际应用当中就应该考虑清楚哪里调用哪里。符合什么条件又调用哪里。这里想值调用一个。就去DoStudent中去掉一个好了。嘿嘿
作者: 水竹    时间: 2014-4-26 13:41
直接调用就好了吧,直接
  1. new BasStudent().sleep();
复制代码

作者: 江夷    时间: 2014-4-26 13:55
水竹 发表于 2014-4-26 13:41
直接调用就好了吧,直接

你这种方法好像需要再创建一个对象实体,
作者: 江夷    时间: 2014-4-26 13:57
伍叶竹 发表于 2014-4-26 13:27
一点想法,这个代码。 DoStudent中调用了两个方法。你又说只想调用一个。感觉,实际应用当中就应该考虑清楚 ...

    也想过你说的这种方法,但是如果这样的话,是不是抽取的意义就不大了,
有没有既保留扩展性又能单独调用的办法。
作者: 水竹    时间: 2014-4-26 14:02
江夷 发表于 2014-4-26 13:55
你这种方法好像需要再创建一个对象实体,

我只是举个例子啊,就是说直接调用就好了么。你要是想用之前的那个对象就给它分配个标识符呗:
  1. BasStudent s = new BasStudent();
  2. dt.doThings(s);
  3. s.sleep();
复制代码

不要用匿名的就好了。
作者: 1636971198    时间: 2014-4-26 14:37
因为你的Student类是抽象类所以子类在继承父类后必须实现其抽象方法!如果你将子类的对象作为参数传递dt.doThings(new BasStudent())
就只有在doThing里改动了!可以只写一个方法!比如study();

作者: eternallove    时间: 2014-4-26 16:49
我觉直接调用new 子类对象调用直接,也好用,不必想那么复杂。。。
作者: 爱翚    时间: 2014-4-26 22:55
由于doThings方法中顺次有两个方法,而这两个方法都是抽象类和子类中所含有的,所以没办法实现单独调用其一的效果.
解决办法只能是使用多态分开来调用.

abstract class Student {
        public abstract void study();

        public void sleep() {
                System.out.println("睡觉");
        }
}

class DoStudent {
        public void doThings(Student x) {
                x.study();
                x.sleep();
        }
}

class BasStudent extends Student {
        public void study() {
                System.out.println("BAS Study");
        }

        public void sleep() {
                System.out.println("BAS Sleep");
        }
}

class AdvStudent extends Student {
        public void study() {
                System.out.println("ADV Study");
        }

        public void sleep() {
                System.out.println("ADV Sleep");
        }
}

class DuoTaiDemo3_1 {
        public static void main(String[] args) {

                /*
                 * 以下这种写法没有办法调用其中之一的方法,因为doThings方法中顺序调用了两个方法study()、sleep()
                 */
                DoStudent dt = new DoStudent();
                dt.doThings(new BasStudent());
                dt.doThings(new AdvStudent());
               
                /*
                 * 解决方案是要么将doThings方法拆成两个,要么直接在main函数中使用多态分两次调用子类中的方法
                 */
                Student bs = new BasStudent();
                bs.study();
                bs.sleep();
               
                Student as = new AdvStudent();
                as.study();
                as.sleep();
        }
}
作者: 小马初长成    时间: 2014-4-27 00:26
dt.doThings(new BasStudent()); dt.doThings(new AdvStudent());这两个去掉其中一个即可
作者: 江夷    时间: 2014-4-27 16:37
水竹 发表于 2014-4-26 14:02
我只是举个例子啊,就是说直接调用就好了么。你要是想用之前的那个对象就给它分配个标识符呗:

不要用匿 ...

可能是我想的太复杂了,直接调用就可以实现需求,无需非要通过抽取后的DoStudent调用,多谢!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2