如何隐藏方法,以便程序员不会调用它,但仍然可以在代码中使用?

Rob*_*ert 4 c# inheritance

我有一个叫做Ship的类和一个叫做的类Lifeboat

救生艇继承自船舶.

Ship包含一个Validate()在save之前调用的方法,它有一个FurtherValidate()从Validate调用的抽象方法.这样做的原因是当你在基础上调用validate时它也验证了继承的类.所以我们有

public class Ship

public bool Validate()
{
    //validate properties only found on a ship

    FurtherValidate();
}

public abstract bool FurtherValidate();
Run Code Online (Sandbox Code Playgroud)

因此,Lifeboat

public override bool FurtherValidate()
{
    //validate properties only found on a lifeboat
}
Run Code Online (Sandbox Code Playgroud)

这意味着任何实现Ship也需要为他们的类提供他们自己的验证,并且保证在save作为基础船被调用.Validate()被调用,它反过来调用继承的验证.

我们如何才能重新开始工作,这样我们仍然可以强制继承类来实现,FurtherValidate()FurtherValidate()程序员永远不能调用它们.目前你可以打电话Lifeboat.FurtherValidate(),我想以某种方式阻止这一点.

alv*_*vin 7

protected abstract bool FurtherValidate();
Run Code Online (Sandbox Code Playgroud)

只有船和救生艇现在可以看到它.

编辑:救生艇必须能够看到它.FurtherValidate当它甚至看不到它时,它应该如何能够覆盖.我会重命名它ValidateCore,'核心'部分(对我而言)意味着不应该在没有充分理由的情况下调用它.

我认为将其抽象但不可见是不容易的.你需要对你的救生艇有一些信心;)


Rob*_* S. 7

简短的回答是,您无法从派生它的类隐藏派生方法.但是,您可以重构代码以完成您要实现的目标:

public class Ship
{    
    public virtual bool Validate()    
    {        
        //validate properties only found on a ship
        return true;
    }
}
public class Lifeboat : Ship
{   
    public override bool Validate()   
    {       
        base.Validate();       
        // lifeboat specific code
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)