8,繼承與關係

2022-02-25 19:09:02 字數 4470 閱讀 2853

概要:

對於一張表,可能存在多重型別。我們可以用繼承來定義它們。

實體關係的應用,解決資料表和表之間一些複雜問題。

內容:

論壇主題表 dbo.topics:

欄位名

字段型別

可空

備註

topicid

intnot null

identity/主鍵

topictitle

varchar(50)

not null

topiccontent

varchar(max)

not null

parenttopic

intnull

如果帖子是主題貼這個欄位為null,否則就是所屬主題id

topictype

tinyint

not null

0 – 主題貼

1 – 回覆帖

定義實體類父類:包含都存在的部分字段。

然後定義可能出現的子類。

再定義各個類和字段的特性。

。。)]判斷型別

用[column(isdiscriminator=true)]標示判斷依據

//基類

[table(name="topics")]

public class topic

[column(isprimarykey=true,isdbgenerated=true)]

public int topicid

[column]

public string topictitle

[column]

public string topiccontent

[column(isdiscriminator=true)]

public int topictype

//新帖,topictype=0,且主題欄位parenttopic為null,即不存在

public class newtopic : topic

public newtopic()

base.topictype = 0;

//回覆貼,帖子型別topictype=1,且主題欄位為主題帖id

public class reply : topic

public reply()

base.topictype = 1;

[column]

public int parenttopic

定義完實體類,下面就是使用方法,首先定義datacontext:

//定義datacontext類

public partial class bbscontext : datacontext

public tabletopics;

public bbscontext(string connection) : base(connection)

讀出來topic類,然後foreach逐行判斷型別,然後再轉換型別:

bbscontext ctx = newbbscontext("");

var query = from c in ctx.topics select c;

foreach(topic t in query )

if (t is newtopic)

newtopic newtopic = t asnewtopic;

//newtopic就是可以使用的newtopic型別

else if(t is reply)

reply reply = t asreply;

//reply就是可以使用的reply型別

或直接使用:

ienumerabletb = (from t inctx.topics.oftype() select t).tolist();

replyrpl =ctx.topics.oftype().single(reply=> reply.topicid == 8);

實體關係的使用:

1、  論壇版塊分類表 dbo.categories:

欄位名

字段型別

可空

備註

categoryid

intnot null

identity/主鍵

categoryname

varchar(50)

not null

2、  論壇版塊表 dbo.boards:

欄位名

字段型別

可空

備註

boardid

intnot null

identity/主鍵

boardname

varchar(50)

not null

boardcategory

intnot null

對應論壇版塊分類表的categoryid

實體類:

[table]

public class categories

public categories()

this._boards = newentityset();

private entityset_boards;

[association(thiskey="category",storage="_boards")]

public entitysetboards

get

set

[column(isprimarykey=true,isdbgenerated=true)]

public int categoryid

[column]

public string categoryname

[table]

public class boards

[association(thiskey="category",storage="_category")]

public categories category

get

setthis._category.entity = value;

value.boards.add(this );

private entityref_category;

[column(isprimarykey=true,isdbgenerated=true)]

public int boardid

[column]

public string boardname

[column]

public int boardcategory

使用:response.write("-------------查詢分類為1的版塊-------------

");var query1 = fromb in ctx.boards whereb.category.categoryid == 1 select b;

foreach (boardb in query1)

response.write(b.boardid + " " + b.boardname + "

");response.write("-------------查詢版塊大於2個的分類-------------

");var query2 = fromc in ctx.boardcategories where c.boards.count > 2 selectc;

foreach (boardcategoryc in query2)

response.write(c.categoryid + " " + c.categoryname + " " +c.boards.count + "

");使用:

dataloadoptionsoptions = new dataloadoptions();

options.loadwith(c => c.boards);

ctx.loadoptions = options;

response.write("-------------查詢版塊大於2個的分類-------------

");varquery2 = from c inctx.boardcategories where c.boards.count > 2select c;

foreach(boardcategory c inquery2)

response.write(c.categoryid + " " + c.categoryname + " " +c.boards.count + "

");使用:

boardcategory dbcat= new boardcategory();

boardoracle = new board();

ctx.boardcategories.add(dbcat);

ctx.submitchanges();

繼承與組合關係

其中乙個編輯原則是 少用繼承多用組合 這句經典的話其實很容易明白,因為在編寫 路上很快就遇到這問題,也很快就明白為什麼,但我為什麼又要記入和?因為我有另乙個層次的體會 在繼承中我們無法呼叫繼承物件,而組合物件誰都可以呼叫。就這句是我體會到的 舉個例子 孩子繼承父親,孩子擁有父親的物件,在呼叫時chi...

c 友元關係與繼承

友元關係不能繼承。基類的友元對派生類的成員沒有特殊訪問許可權。如果基類被授予友元關係,則只有基類具有特殊訪問許可權,該基類的派生類不能訪問授予友元關係的類。class base frnd has no access to members in d1 class d1 public base clas...

Java 繼承與介面的關係

在看netty中nioeventloop的uml圖時,感覺非常複雜,如下圖所示 找不到重點,找不到主線,此時內心生無可戀。從而,激發出困擾了我很久的乙個問題 到底繼承與介面 啥關係?這個問題,前幾天也請教過同事,也並沒有說出什麼關鍵點來。然後,對著此圖沉思了良久,終於悟出一點自己的見解 以下僅供參考...