给出一个开放的泛型类定义:
public abstract class BaseUI<T> : INotifyPropertyChanged, IChangeTracking, IDataErrorInfo, ISelectable
where T: new()
{
public BaseUI()
{
}
public BaseUI(T data)
{
// initialization
}
}
和一个封闭的实现:
public class AccountUI : BaseUI<Account>
{
public AccountIU()
: base()
{
}
public AccountUI(Account data)
: base(data)
{
}
}
如何访问T / Account的属性?这是否可能在3.5(即没有动态)
答案 0 :(得分:0)
您可以通过类型为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
提供的类型参数,因此它可以使用该类型的可访问成员。