您可以通過基類的任何可訪問的成員訪問派生類中的這些屬性,其類型是T
(或者,當然,通過派生類的任何成員其類型爲Account
)。
(有沒有在上一個抽象類型的公共構造函數是沒有意義的,所以我改變了這些受保護的。)
例如,假設Account
類型有一個布爾IsOverdue
屬性:
public abstract class BaseUI<T> : INotifyPropertyChanged, IChangeTracking, IDataErrorInfo, ISelectable
where T: new()
{
protected BaseUI() {}
protected BaseUI(T data) { this.Data = data; }
protected T Data { get; private set; }
}
public class AccountUI : BaseUI<Account>
{
public AccountUI() : base() {}
public AccountUI(Account data) : base(data) {}
public void SomeMethod()
{
if (this.Data.IsOverdue)
{
//... handle overdue account
}
}
}
現在,可能會出現在通用上下文中引用了BaseUI<T>
的情況,因此在編譯時您不知道類型參數是什麼。在這種情況下,你需要在基類的抽象方法:
public abstract class BaseUI<T> : INotifyPropertyChanged, IChangeTracking, IDataErrorInfo, ISelectable
where T: new()
{
protected BaseUI() {}
protected BaseUI(T data) { this.Data = data; }
protected T Data { get; private set; }
public abstract void SomeMethod();
}
在這個例子中,你需要的override
關鍵字添加到AccountUI.SomeMethod聲明:
public class AccountUI : BaseUI<Account>
{
public AccountUI() : base() {}
public AccountUI(Account data) : base(data) {}
public override void SomeMethod()
{
if (this.Data.IsOverdue)
{
//... handle overdue account
}
}
}
現在您可以致電SomeMethod
對BaseUI<T>
的任何引用。派生類負責提供實現。和第一個例子一樣,派生類知道爲T
提供的類型參數,因此它可以使用該類型的可訪問成員。
*您需要訪問屬性,並且它們是否包含在任何受限接口中? – 2012-04-02 11:36:29
(僅供參考,您在第一個構造函數中存在拼寫錯誤。) – Bridge 2012-04-02 11:39:52
我需要在多個實例中訪問它們,其中一些內部類但主要在UI或類似的消費者中 – 2012-04-10 12:42:03