日期:2014-05-20  浏览次数:20680 次

求一面向对象的题目的答案
一个超市类SuperMaket作为主类,一个抽象商品类Goods,一个抽象家具类Furniture,一个具体桌子Table类。进货类Purchase,销售类Sell,库存类Deposite。要求商品进货时库存中商品自动增加,商品销售时库存商品自动减少;货物原有200,其中家具100,桌子0。 
输出:
进货: 桌子5
库存:桌子5,家具105,货物205
销售: 桌子1
库存:桌子4,家具104,货物204
要求:因为类似于桌子的商品成千上万,为了代码复用、具有普遍性,Purchase,Sell,Deposite三个类中不允许带有Table、Furniture名称或带有“桌子”“家具”字符串的语句,如果有,不给分。但可以带有Goods名称或“货物”字符串,因其具有通用性。Table类中可以带有“家具”字符串的语句,因为它是家具类的子类,具有通用性。

------解决方案--------------------
太2了。
谁能发明这么不切实际的题目啊~~.
真纠结
Java code
import java.util.HashMap;
import java.util.Map;

public class SuperMaket {

    public interface TypeAware{
        String getTypeName();
        int getCount();
    }
    public static class Goods implements TypeAware{
        private final static String TypeName="货物";
        int count;
        public Goods(int count) {
            this.count = count;
        }
        public String getTypeName() {
            return TypeName;
        }
        public int getCount() {
            return count;
        }
    }
    public static class Furniture extends Goods{
        private final static String TypeName="家具";
        public Furniture(int count) {
            super(count);
        }
        public String getTypeName() {
            return TypeName;
        }
    }
    public static class Table extends Furniture{
        private final static String TypeName= "桌子";
        public Table(int count) {
            super(count);
        }
        public String getTypeName() {
            return TypeName;
        }
    }
    
    public static class Purchase{
        private Deposite deposite;
        public Purchase(Deposite deposite) {
            this.deposite = deposite;
        }
        void purchase(Goods goods){
            deposite.add(goods);
            print(goods);
        }
        void print(Goods goods){
            System.out.println("进货:"+goods.getTypeName()+goods.getCount());
            deposite.print();
        }
    }
    public static class Sell{
        private Deposite deposite;
        public Sell(Deposite deposite) {
            this.deposite = deposite;
        }
        void sell(Goods goods){
            deposite.remove(goods);
            print(goods);
        }
        void print(Goods goods){
            System.out.println("销售:"+goods.getTypeName()+goods.getCount());
            deposite.print();
        }
    }
    public static class Deposite{
        Map<String, Goods> depository = new HashMap<String, Goods>();
        void add(Goods goods){
            Goods g = depository.get(goods.getTypeName());
            if(g==null){
                depository.put(goods.getTypeName(), goods);
            }else{
                g.count += goods.count;
            }
            for(Map.Entry<String, Goods> e : depository.entrySet()){
                if(e.getValue().getClass().isAssignableFrom(goods.getClass())){
                    if(goods.getTypeName()==e.getKey()){
                        continue;
                    }
                    e.getValue().count += goods.count;
                }
            }
        }
        void remove(Goods goods){
            Goods g = depository.get(goods.getTypeName());
            if(g!=null){
                g.count -= goods.count;
            }
            for(Map.Entry<String, Goods> e : depository.entrySet()){
                if(e.getValue().getClass().isAssignableFrom(goods.getClass())){
                    if(goods.getTypeName()==e.getKey()){
                        continue;
                    }
                    e.getValue().count -= goods.count;
                }
            }
        }
        void print(){
            System.out.print("库存:");
            boolean fistCycle=true;
            for(Map.Entry<String, Goods> e : depository.entrySet()){
                if(fistCycle){
                    fistCycle=false;
                }else{
                    System.out.print(',');
                }
                System.out.print(e.getKey());
                System.out.print(e.getValue().getCount());
            }
            System.out.println();
        }
    }
    public static void main(String[] args) {
        Deposite deposite = new Deposite();
        deposite.add(new Goods(100));
        deposite.add(new Furniture(100));
        deposite.add(new Table(0));
        deposite.print();
        System.out.println("========我==是==分==割==线========");
        Purchase purchase = new Purchase(deposite);
        purchase.purchase(new Table(5));
        Sell sell = new Sell(deposite);
        sell.sell(new Table(1));
    }

}