簡體   English   中英

強制子類實現私有方法

[英]Force child class to implement private method

我有以下代碼:

public abstract class NavEntityController<ChildEntity> where ChildEntity : NavObservableEntity
{
    public abstract void Delete(ChildEntity line);
    public abstract void Update(ChildEntity line);
    public abstract void Create(ChildEntity line);

    public void PushChangesToNav(NavObservableCollection<ChildEntity> lines) 
    {
        foreach (var line in lines)
        {
            line.ErrorLastAction = false;
            EntityState previousState = line.CurrentState;

            try
            {
                switch (line.CurrentState)
                {
                    case EntityState.Unchanged:
                        break;
                    case EntityState.NeedsCreate:
                        Create(line);
                        line.CurrentState = EntityState.Unchanged;
                        break;
                    case EntityState.NeedsUpdate:
                        Update(line);
                        line.CurrentState = EntityState.Unchanged;
                        break;
                    case EntityState.NeedsDelete:
                        Delete(line);
                        line.CurrentState = EntityState.Deleted;
                        break;
                }
            }
            catch (Exception e)
            {
                //...
            }        
        }
    }
}

我需要一個基類來繼承這個類,比如:

public class NavJobController : NavEntityController<NavObservableJob>
{
    public NavJobController( {}

    public override void Delete(NavObservableJob line) {//Implementation here}
    public override void Update(NavObservableJob line) {//Implementation here}
    public override void Create(NavObservableJob line) {//Implementation here}

    //Other functionality
}

但是,我不希望有人能夠這樣做:

NavJobController j = new NavJobController();
j.Create(new NavObservableJob());

但只想要以下方法:

j.PushToNav(); //以及基類中的任何其他公共功能可用

本質上,我想強制子類實現CRUD操作,而不是將它們暴露給公眾。 我希望的理想語法如下:

private abstract void Delete(ChildEntity line);
private abstract void Update(ChildEntity line);
private abstract void Create(ChildEntity line);

這就是存在protected可見性的原因(對於基類和派生類都是可見的,但是不能公開地從實例中使用它們)。

如果需要在解決方案的某個位置公開訪問這些方法,則可能需要使用internal而不是protected並使用[InternalsVisibleTo]屬性使某些程序集可以看到內部構件。

這樣做的方法是使用protected abstract 這會將方法暴露給后代類型,但不會暴露給外部人員,以及強制某些后代必須實現該方法。

所以這就是你要聲明它的方式:

public abstract class NavEntityController<ChildEntity> where ChildEntity : NavObservableEntity
{
    protected abstract void Delete(ChildEntity line);
    protected abstract void Update(ChildEntity line);
    protected abstract void Create(ChildEntity line);

    ... rest of class

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM