【问题标题】:Force child class to implement private method强制子类实现私有方法
【发布时间】:2015-10-27 23:09:46
【问题描述】:

我有以下代码:

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 abstract。

标签: c# .net oop


【解决方案1】:

这就是protected 可见性存在的原因(基类和派生类都可见,但不能从实例公开使用它们)。

如果您需要在解决方案中的某处公开访问这些方法,您可能需要使用internal 而不是protected,并使用[InternalsVisibleTo] 属性使某些程序集可以看到内部。

【讨论】:

  • 我一直避免因为这个原因受到保护:stackoverflow.com/questions/3182653/….. 我现在重新阅读它,发现它只适用于属性
  • @David 这只是一个意见。
  • @David 这个答案被严重夸大了。受保护成员本身并没有错,或者至少不超过公共成员。
  • @CodeCaster 绝对...实际上,您可以通过使一些只读属性虚拟/抽象来通过代码提供设置,因此派生类提供覆盖它们的值以使一切按预期工作...
【解决方案2】:

执行此操作的方法是使用protected abstract。这会将方法暴露给后代类型,但不会暴露给外人,并强制 some 后代必须实现该方法。

这就是你要声明它的方式:

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

【讨论】:

    猜你喜欢
    • 2010-12-18
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 2012-11-14
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    相关资源
    最近更新 更多