强制子类实现私有方法

时间:2015-08-05 09:05:59

标签: c# .net oop

我有以下代码:

NameVirtualHost *
<VirtualHost *:80>
    ServerName nodejsdomain.com

    ProxyRequests off

    <Proxy *>
        Require all granted
    </Proxy>

    <Location />
        ProxyPass http://localhost:3000/
        ProxyPassReverse http://localhost:3000/
    </Location>

</VirtualHost>

我需要一个基类来继承这个类,比如:

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()); //以及基类中可用的任何其他公共功能

基本上,我想强制子类实现CRUD操作,而不是将它们暴露给公众。我希望的理想语法如下:

j.PushToNav();

2 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:1)

执行此操作的方法是使用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