Rumah > Soal Jawab > teks badan
伊谢尔伦2017-04-18 10:47:59
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;
}
伊谢尔伦2017-04-18 10:47:59
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
迷茫2017-04-18 10:47:59
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?
天蓬老师2017-04-18 10:47:59
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.
PHP中文网2017-04-18 10:47:59
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.