簡體   English   中英

繼承Java中受保護的成員與私有成員

[英]Protected member Vs private member in inheritance java

我有一個abstract class Entity ,然后多個實例可以擴展Entity

喜歡

A extends Entity {
}
B extends Entity {
}

現在所有的實體都需要有entityId

因此,我應該將entityId作為Entity的私有字段並通過構造函數進行設置,還是作為Entityprotected成員進行設置,以便子類可以直接訪問它?

首先,您可以將entityId重命名為id因為它顯然是實體的id。 它是Entity的成員。

我將假定id不能更改,因此它應該是私有的,只能在構造函數中設置一次。 該類應具有公共的getId()方法。 這樣,除了子類之外,其他對象也可以訪問它。

使用此實現,子類不會意外更改id

您應將entityId作為受保護的實體基礎類型的一部分。

從設計角度來看, entityID應該是實體的一部分。 因此,將其放在Entity類中並使其protected以便其子類可以訪問它。

這可能是protected成員存在的主要原因。 基本上,它與private相同,但是它對您的子類同一包中的類顯示為public (如果您擔心,請使用private )。

現在,這是繼承結構中實例變量的一般理論,但是正如其他人指出的那樣,由於這似乎與ID字段有關,因此最好將其設置為private ,也可以將其設置為final 然后編寫一個public getter方法,除非除子類之外沒有人可以獲取ID,然后將其設置為protected

使用protected,以便所有繼承的類都可以訪問它。

如果基類構造函數接受實體ID的值,如下所示

class Entity
{
  protected int EntityId;
  public Entity(int _entityId)
    {
       EntityId=_entityId;
    }

}

然后,您可以使用“ super”函數從派生類構造函數調用基類構造函數

class ExtendedEntity extends Entity
{

  public ExtendedEntity (int _entityId)
    {
       super(_entityId); // calling base class constructor
    }

}

在Entity中將其設為私有字段,並創建(受保護的)訪問器(getter / setter),以便子類可以通過setter或getter來訪問字段(基本的OO原理)

您還可以為Entity類編寫一個特定的構造函數,以id作為參數,並從擴展類中調用此構造函數。 這樣,您的子類總是被迫設置一個id。

例如。

public class Entity {
    private int id;
    public Entity(int id) { 
        setId(id);
    }
    protected int getId() {
        return id;
    }

    protected void setId(int id) {
        this.id = id;
    }
}

public class A extends Entity {

    public A(int id) {
        super(id);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM