java中没有抽象方法的抽象类有什么意义?仅仅是为了让别人不能创建该类的对象?
怪我咯
怪我咯 2017-04-18 10:45:59
0
6
747
怪我咯
怪我咯

走同样的路,发现不同的人生

membalas semua(6)
伊谢尔伦

Tempat yang paling biasa digunakan adalah untuk melaksanakan kaedah templat (Kaedah Templat)?
Sebagai contoh, anda ingin menulis sekumpulan proksi tempatan untuk perkhidmatan jauh. Untuk kumpulan ejen ini, langkah mendapatkan alamat permintaan, menghantar permintaan dan mendapatkan kandungan yang sepadan adalah perkara biasa. Hanya dua langkah untuk mentakrifkan jenis pengekodan aksara dan mentakrifkan panggilan balik respons adalah berbeza.

Pada masa ini, anda boleh menentukan kelas abstrak dan melengkapkan proses permintaan. Perbezaannya diserahkan kepada subkelas sebenar untuk ditentukan. Bukannya pereka bentuk [tidak membenarkan] kelas abstrak dijadikan instantiated, tetapi sesetengah atribut tidak boleh ditentukan sebelum mengetahui ciri-ciri perkhidmatan jauh, menjadikan instantiasi mustahil.

Contoh dalam JDK ialah java.io.InputStream. Kaedah baca(bait[], int, int)nya memanggil kaedah java.io.InputStream.read(). Read() ialah kaedah abstrak dan perlu ditakrifkan dalam subkelas. Anda boleh belajar daripada kod sumber.

 public abstract int read() throws IOException;

 public int read(byte b[], int off, int len) throws IOException {
    if (b == null) {
        throw new NullPointerException();
    } else if (off < 0 || len < 0 || len > b.length - off) {
        throw new IndexOutOfBoundsException();
    } else if (len == 0) {
        return 0;
    }

    int c = read();
    if (c == -1) {
        return -1;
    }
    b[off] = (byte)c;

    int i = 1;
    try {
        for (; i < len ; i++) {
            c = read();
            if (c == -1) {
                break;
            }
            b[off + i] = (byte)c;
        }
    } catch (IOException ee) {
    }
    return i;
}
伊谢尔伦
  • Anda perlu melihat sama ada ia mewarisi mana-mana kelas atau melaksanakan sebarang antara muka

  • Kemungkinan besar beberapa kaedah kongsi diletakkan

  • Jika tidak, mengapa tidak menukarnya kepada antara muka

左手右手慢动作

Sesetengah kaedah awam dan medan contoh mungkin telah diekstrak.

迷茫

Bukannya kelas abstrak tanpa kaedah abstrak mempunyai makna istimewa. Ini hanyalah makna biasa bagi kelas abstrak, Memandangkan pelaksanaan lalai, ia mungkin memerlukan kurang kod daripada melaksanakan antara muka secara langsung. Sebaliknya, apakah gunanya memerlukan kelas abstrak untuk mengekalkan satu atau dua kaedah abstrak?

Peter_Zhu

Sebaliknya, untuk subkelas kelas ini mencipta kaedah tertentu . Sudah tentu, ini juga merupakan keperluan antara muka, tetapi antara muka memerlukan semua kaedah menjadi kaedah abstrak. Tetapi kelas abstrak boleh mentakrifkan beberapa kaedah yang tidak perlu ditindih oleh subkelas.

Kelas dan antara muka abstrak semuanya untuk pengabstrakan. Saya tidak akan bercakap tentang faedah pengabstrakan. Contohnya, jika kami ingin melaksanakan antara muka atau kelas Equal, kami mentakrifkan dua kaedah equal dan unequal. Jika dilaksanakan menggunakan antara muka, kelas mesti melaksanakan kedua-dua kaedah ini. Walau bagaimanapun, jika dilaksanakan dengan kelas abstrak, unequal boleh dilaksanakan sebagai !equal dalam kelas abstrak, supaya unequal perlu dilaksanakan dalam subkelasnya.

Secara peribadi, saya lebih suka kelas abstrak (tetapi Java tidak menyokong berbilang warisan). Contohnya, antara muka Compareable sebenarnya mempunyai keperluan, jika a<b && b < c maka a < c, tiada jaminan dalam antara muka bahawa ini betul. Sudah tentu, kelas abstrak tidak dapat menyelesaikan masalah, tetapi untuk Equal di atas, pelaksanaan kelas abstrak lebih sesuai dengan keperluan tambahan.

洪涛

Contoh:
Berdasarkan: mvc musim bunga

public abstract class BaseController {
    protected HttpServletRequest request;
    protected HttpServletResponse response;
    protected HttpSession session;

    @ModelAttribute
    public void setReqAndResp(HttpServletRequest request, HttpServletResponse response){
        this.request = request;
        this.response = response;
        this.session = request.getSession();
    }
    protected Map<String,String> getLoginUser(){
        Object loginUser = request.getAttribute(Config.LOGIN_USER);
        Map<String,String> loginUserMap = new HashMap<>();
        loginUserMap.put(Config.USER_CODE,loginUser==null?"":loginUser.toString());
        return loginUserMap;
            //return (User) session.getAttribute(Constants.LOGIN_USER);
    }
}

Sesi tindak balas permintaan atribut global biasa
Kaedah biasa getLoginUser()
Sudah tentu akan ada yang lain (beberapa atribut dan kaedah biasa).
Memandangkan ada controller, service dao pun boleh guna.
Saya biasanya mengekstrak beberapa kod tetapan semula ke dalam kelas induk untuk digunakan.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan