我有以下代码:
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();
答案 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