2011-09-12 48 views
1

可以說我有一個基類和子這樣的:C#方法簽名的對象引用

class BaseType 
{ 
    string Name{get;set;} 
    string AddressLine1 {get;set;} 
    string PostalCode {get;set;} 
} 


class ChildType : BaseType 
{ 
    string extrafield {get;set;} 
} 

編輯:

我的自定義更新的方法是兩個對象爲所有,但一個相同額外的領域。這些對象在WCF服務中使用,因此重用自定義SET WCF服務是我正在嘗試做的。

所以我會通過BaseTypeChildType;能夠訪問任何對象的基本屬性並執行任何邏輯。

我試圖減少重複的代碼。

+2

這些屬性,而不是字段。這兩個術語不可互換。無論如何,你指的是什麼更新方法和什麼SET方法? – BoltClock

+0

不要這樣做。使Set()方法變爲虛擬,以便可以在派生類中重寫它。它可以爲三個基本屬性調用base.Set()。 –

回答

4

您可以只使用BaseType爲參數的方法:

​​

這允許你寫:

ChildType child = new ChildType() { Name = "Foo"; } 
DoSomethingWithType(child); 
2
void SetMethod(BaseType obj) 
{ 
    obj.Name = ... 
    obj.AddressLise1 = .. 
    obj.PostalCode = ... 
    if (obj is ChildType) 
    { 
     ((ChildType)obj).extraField = ... 
    } 
} 
+0

instanceof ???? – Tigran

+0

@Reed這只是一個例子。沒有跡象表明問題中的「更新方法」或「設置方法」是什麼樣子。 –

+1

@Tigran忘了把我的C#帽。 –

0

我不是100%肯定我明白什麼叫「更新方法」你reffering,但在一般的自動屬性不能以任何方式進行定製。然而,只要你爲自己創造了一個支持領域,你可以將任何你想要的代碼放在屬性的setter中。

儘管所有屬性都有一個集合類型,但是您可以分配另一個類型的唯一方法是如果該類型可分配給屬性類型。

0

聽起來像是不錯的情況下,爲「是」的關鍵字。

void doSomething(BaseType b) 
{ 
    if (b is ChildType) 
    { 
    // stuff with ChildType's extra properties 
    } 
} 

is keyword

+0

如果這是一個類而不是一個值類型,那麼'as'和一個空檢查將是一個更好的選擇。稍微快一點,並且已經轉換爲if語句中的正確類型。 –

0

這是相當困難的瞭解你究竟需要。如果我的猜測是正確的,那麼你應該這樣做(檢查類型的實例中的方法是一般不好的做法):

void Update(BaseType obj) 
{ 
    obj.Name = "aaa"; 
    obj.PostalCode = "123556"; 
} 

void Update(ChildType obj) 
{ 
    b.ExtraField = "extra"; 
    Update((BaseType)obj); 
} 
0

不是100%肯定,我讀正確的問題,但我給它是一個鏡頭,從這一行中取出我的提示:「所以我會傳入BaseType或ChildType;能夠訪問任何對象的基本屬性並執行任何邏輯操作。」

因此,讓我們假設一個函數foo需要一個參數。

如果你有foo(BaseType b)則:

  • 您可以傳遞基本類型的實例或ChildType
  • 您可以訪問基本類型定義的所有屬性
  • ,但你不能沒有可笑的訪問extrafield成員鑄造shenanigans

這是一個非常好的理由:你的函數採用BaseType,它沒有extrafield,因爲它沒有'你不能參考它。

如果沒關係,那麼就這樣做。如果你需要訪問extrafield,那麼你有一個小問題。

foo的另一種形式是foo(ChildType c)這將意味着:

  • 你只能接受ChildType的情況下,不BASETYPE
  • 的實例,但你可以訪問任何屬性,包括名稱和extrafield

我在這裏首先要考慮的解決方案是擴展BaseType的簽名以包含extrafield。當您的簽名在您想要互換處理的各個級別層次結構中保持一致時,多態性效果最佳。即使extrafield在BaseType中沒有多少意義,你也許希望使BaseType抽象化,或者在那裏放置一個沒有操作的extrafield。

我想說,如果你的設計需要爲子類簽名,你會遇到困難,因爲它可以與BaseType完全互換。

+0

這很好。我只想要一個操作用於'BASE'類型。 – Arnej65