3 回答

TA貢獻(xiàn)2019條經(jīng)驗(yàn) 獲得超9個(gè)贊
一般來說,這沒有什么不好。如果基類包含需要了解其所有子類的邏輯(例如,為了決定在某些方法調(diào)用中返回哪個(gè)實(shí)例),這只是一種不好的做法,因?yàn)檫@可能會(huì)破壞基類(或強(qiáng)制它更新)任何時(shí)候引入新的子類。
另一方面,JDK 本身包含引用其子類的類的示例。
例如(雖然這可能有點(diǎn)作弊),Object
該類包含對(duì)String
and 的引用Class
,它們是它的子類。
如果你的階級(jí)關(guān)系需要它,它沒有錯(cuò)。

TA貢獻(xiàn)1765條經(jīng)驗(yàn) 獲得超5個(gè)贊
一般來說,你不想要雙向依賴,也不希望基類知道它的子類,但只是相反,因?yàn)樗鼈兌伎赡茉陬愔g創(chuàng)建強(qiáng)耦合,即任何一方的變化都可能有雙方的后果。
但這并不意味著您不想使用這種耦合。
有時(shí)這種耦合是不可取的,但有時(shí)是可取的,在這里它似乎是一種可取的耦合:父級(jí)和子級(jí)在語義上非常耦合,因此以后您想要隔離用戶或?qū)嶓w的可能性很小他們之間更加獨(dú)立。
所以你接受甚至希望這種耦合避免沒有價(jià)值的重復(fù)/復(fù)雜性。
請(qǐng)注意,您可以通過引入一個(gè)接口來定義實(shí)體來解耦事物,但是很多代碼無法獲得一個(gè)偉大的東西:
public interface EntityAble {
User getUserCreated();
Date getDateCreated();
User getUuserModified();
Date getDateModified();
// setters
}
定義實(shí)體,例如:
public class Entity implements EntityAble {
private User userCreated;
private Date dateCreated;
private User userModified;
private Date dateModified;
// override getters/setters
}
和用戶為:
public class User implements EntityAble {
private String username;
private User userCreated;
private Date dateCreated;
private User userModified;
private Date dateModified;
// override getters/setters
}
現(xiàn)在 Entity 由 User 字段組成,這些字段不是 Entity 而是大量重復(fù)/ LOC 不一定會(huì)有所收獲。
在某些用例中,這種設(shè)計(jì)可能有意義,但對(duì)于您的實(shí)際需求來說,這聽起來是一種開銷。

TA貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個(gè)贊
在我看來,它本身并沒有什么壞處。
這實(shí)際上只是“對(duì)象可以包含自己?jiǎn)??”這個(gè)問題的略微修改版本。兩種情況的答案都是一樣的——是的,沒關(guān)系。
例如,鏈表中的節(jié)點(diǎn)將包含對(duì)下一個(gè)和上一個(gè)節(jié)點(diǎn)的引用,例如:
class Node
{
private Node next;
private Node previous;
}
這個(gè)設(shè)計(jì)沒有什么不好。
在你的情況,User 是一種Entity,只是更專業(yè)。上面例子的類比可能是Nodeand BranchedNode。
但是,您可能要考慮的一件事是,如果用戶要求用戶創(chuàng)建它們,那么哪個(gè)用戶將創(chuàng)建第一個(gè)用戶?有點(diǎn)雞和蛋的情況。也許第一個(gè)用戶將擁有userCreated和userModified等于空?或者他們會(huì)指向自己?
添加回答
舉報(bào)