![](/img/trans.png)
[英]Abstract property with public getter, define private setter in concrete class possible?
[英]NHibernate Abstract Repository ISession Property in Concrete Class
我不知道如何問我的問題,所以我會寫幾行代碼......
我有一個像這樣的抽象基礎 class AbstractRepository :
public abstract class AbstractRepository : IGenericRepository
{
protected ISession Session
{
get
{
return Startup.SessionFactory.GetCurrentSession();
}
}
//More code left out for clarity
}
實現抽象 class 的具體 class,AbstractRepository:
public class AccommodationRepository : AbstractRepository
{
// Allow the Session property to be returned from the base class.
public ISession Session => base.Session;
// Which I understand to be the same as the line below:
// public ISession session { get { return base.Session; } }
public async Task<EPICCard> GetByCardNumber(long epicCardId)
{
var session = Session;
CancellationTokenSource token = new CancellationTokenSource();
//Do stuff - not important for now.
return theQueryTask.Result;
}
}
Re-Sharper 建議對該行進行以下更改:
公共 ISession Session => base.Session;
至
公共新ISession Session => base.Session;
我應該使用哪一個,為什么?
有人可以解釋其中一個的原因嗎? 不知道是不是理解不夠
創建“新”ISession 的原因是什么?
你不能覆蓋一個方法,除非它是abstract
或virtual
,所以這樣做:
public ISession Session => base.Session;
您正在隱藏基本實現而不是覆蓋它。
這會導致基於引用而不是實例來選擇屬性的get
實現。
在您的具體示例中,這幾乎沒有什么區別,但是,這是一個示例:
public class AccommodationRepository : AbstractRepository
{
public ISession Session => new SomeOtherSession();
void SomeMethod()
{
AbstractRepository thisAsAbstract = this;
object.ReferenceEquals(this.Session, thisAsAbstract.Session); // false
}
}
這是因為thisAsAbstract.Session
使用了Session
的基本實現,因為它只是被隱藏了。
ReSharper 的建議(使用new
關鍵字)只是為了明確表明方法隱藏是有意的而不是偶然的,就像您的情況一樣(因為您正在更改訪問修飾符)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.