1、不要為抽象類提供公開的構造方法
抽象類可以有構造方法,但是抽象類不能例項化。如果程式設計人員沒有制定構造方法,編譯器會自動生成乙個預設的protected構造方法。下面是乙個標準的簡單抽象類:
abstract class myabstractclass
}抽象類的構造方法不應該是public或internal的。抽象類設計的本意是只能讓子類繼承,而不是用於生成例項物件。如果抽象類是public或者internal的,它對於其他型別來說就是可見的,而這是不必要的,多餘的。抽象類只需對子類可見即可。
2、可見字段應該重構為屬性
欄位與屬性有本質的區別,屬性是方法。如下面的person型別:
class person
}編譯器針對屬性name編譯後,會生成乙個欄位和兩個方法。
屬性相對於字段有如下優勢:
1)可以為屬性新增**。屬性是方法,所以可以在方法內對設定或獲取屬性的過程進行編寫**控制。如事件支援等。
2)可以讓屬性支援執行緒安全。要讓屬性變成執行緒安全的,可以讓型別自身去實現。如果讓字段支援執行緒安全,就只有依靠呼叫者本身實現。
3)屬性得到vs編譯器支援,能實現自動屬性的功能。自動屬性的特點在linq中應用十分廣泛,在匿名型別中,它只能實現唯讀的自動屬性,但字段不支援。
4)從設計的角度(物件導向),公開的字段也應該使用屬性。改變欄位的狀態,型別不會被通知到;而改變屬性的值,型別支援則會被通知。
綜上,如果乙個型別存在乙個可見字段,那麼它應該被重構為屬性。如果某個屬性只對內部可見,但不涉及上面4點,則建議使用字段。
3、區別對待override和new
override和new使型別體系因為繼承而呈現出多型性。多型是「物件導向語言」的三個重要特性之一。多型要求子類具有與基類方法同名的方法,而override和new的有如下作用:
1)如果子類中的方法前面帶有new關鍵字,則該方法被定義為獨立於基類的方法。
2)如果子類fzqwzkp中的方法前面帶有override關鍵字,則子類的物件將呼叫該方法,而不是呼叫基類的方法。
如果,對於父類的方法在子類中使用了new關鍵字,則兩個方法相互獨立。此時,使用子類型別的物件fzqwzkp呼叫方法時,程式執行的將是子類型別new的方法**;而如果將子類型別轉換為父類程式設計客棧型別後,物件呼叫方法時將執行的是父類的方法**。
如果使用了override關鍵字重寫方法,那麼不論子類型別的物件是否轉換為父類型別,呼叫方法時都將執行的是子類的**。
如果對於子類中,宣告與父類相同函式名稱的方法,但並不使用關鍵字new和override。編譯器在編譯後會提出警告,但不影響程式執行。此時,編譯器會預設為是new的效果,所以輸出和顯示設定與new的效果www.cppcns.com一樣。
4、避免在構造方法中呼叫虛成員
在構造方法中呼叫虛成員會出現意想不到的錯誤。
class program }
class person
protected virtual void initskin()
}class chinese:person
; }
protected override void initskin( )
}class rece
}執行該示例,會出現nullreferenceexception:未將物件引用設定到物件的例項。
在呼叫**中,需要建立乙個chinese的例項物件chinese。由於chinese型別有基類person,所以執行時首先呼叫基類的構造方法。在基類的構造方法中,建構函式會呼叫initskin虛方法。在程式執行時,呼叫的是子類的initskin方法。在子類的initskin方法中又在使用子類的rece變數。但這個時候,子類的建構函式還沒呼叫,因此rece變數未例項化,但是initskin方法又在使用rece變數,導致錯誤。
5、成員應優先考慮公開的基型別或介面
型別成員在優先考慮公開基型別或介面,會使得型別支援更多的應用場合。
fcl中的集合型別根據功能劃分有list、dictionary、hashset等。例如,需要清空集合中的元素,返回空集合的方法empty,如果不返回基型別或者介面的情況下,就要求我們為每個集合型別都實現該方法。但是,在fcl中實現了乙個靜態型別enumerable,**如下:
public static ienumerable empty()
使用了泛型介面ienumerable,所以所有集合子類都可以不實現自己的empty方法,做到專案的靈活應用。
6、重寫時不應使用子類引數
重寫時,如果使用了子類引數,可能會偏離設計者的預期目標。
如存在以下繼承體系:
class employee
class manager:employee
class salary
} class managersalary:salary
}型別managersalary中的setsalary方法重寫了salary中的相同方法,但是引數採用了乙個子類的引數。現在在程式中呼叫**如下:
public static void main()
設計者的本意時為經理設定對應的薪水,但是實際呼叫的**卻設定了員工的薪水。因此,在重寫時使用子類引數有一定的風險。正確的方法時仍舊使用employee型別引數,讓編譯器提醒我們要使用關鍵字new。
oracle 修改字段型別的方法
因為業務需要,修要修改某個字段資料型別有number 5 變為number 5,2 型 要是沒有資料的話直接用以下語句即可 alter table tb test modify permile number 5,2 但是有資料的話 就不能用上面方法了,alter table tb test add ...
oracle 修改字段型別的方法
要是沒有資料的話直接用以下語句即可 alter table tb test modify permile number 5,2 但是有資料的話 就不能用上面方法了,alter table tb test add permile temp number 5,2 update tb test set p...
資料庫字段設計的一些建議
在資料庫開發的時候,表之間的聯絡,可以用外來鍵 外來鍵可以帶來資料的完整性和一致性。但其缺點也是顯而易見的,會讓開發的難度增大。本人不討論是否使用外來鍵。因為它的作用和麻煩程度相信大家都有自己的判斷。我想討論的是,在不使用外來鍵的情況下,通過規則來使表之間存在聯絡。比如,一張資料庫,有使用者,有他所...