代码之家  ›  专栏  ›  技术社区  ›  Robert

我如何隐藏一个方法,使它不被程序员调用,但在代码中仍然可用?

  •  4
  • Robert  · 技术社区  · 16 年前

    我有一门课叫 Ship 还有一个叫做 Lifeboat

    救生艇是从船上继承下来的。

    Ship包含一个名为 Validate() 它在保存之前被调用,它有一个抽象方法 FurtherValidate() 它从Validate调用。这样做的原因是,当您在基础上调用validate时,它也会验证继承的类。所以我们有

    public class Ship
    
    public bool Validate()
    {
        //validate properties only found on a ship
    
        FurtherValidate();
    }
    
    public abstract bool FurtherValidate();
    

    救生艇

    public override bool FurtherValidate()
    {
        //validate properties only found on a lifeboat
    }
    

    还需要为他们的类提供自己的验证,并且保证在save-as-baseship上调用。 验证() 调用,依次调用继承的验证。

    我们如何重新处理这个问题,以便仍然强制继承类实现 进一步验证() 但是 进一步验证() 不能被程序员调用。目前你可以打电话 Lifeboat.FurtherValidate()

    9 回复  |  直到 13 年前
        1
  •  7
  •   Robert S.    16 年前

    简而言之,您不能从派生它的类中隐藏派生方法。但是,您可以重构代码以实现您想要实现的目标:

    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;
        }
    }
    
        2
  •  7
  •   alvin    16 年前
    protected abstract bool FurtherValidate();
    

    编辑: 救生艇必须能看见它。它应该如何能够覆盖 FurtherValidate 当它甚至看不见的时候。我会把它改名为 ValidateCore “核心”部分(对我来说)意味着,如果没有很好的理由,就不应该叫它。

        3
  •  4
  •   Scott Dorman    16 年前

    你所描述的确切情况是不可能的。您可以限制对 FurtherValidate 方法仅使用派生类 protected 访问修饰符。还可以通过使用 internal 修饰符,但这仍然允许编写派生类的程序员随时调用进一步验证。同时使用protected和internal将两者结合起来,这实际上意味着仅限于派生类或在同一程序集中定义的类。

    使用[EditorBrowsable]属性是一种IDE技巧,它会对IntelliSense隐藏该方法(除非其他程序员在VS中启用了正确的选项)。这将有效地防止大多数人调用它(如果他们看不到,它就不存在)。

    您可以使用反射来询问您的调用方是谁,但我认为这样做的性能成本与好处相比太高。

        4
  •  3
  •   Jack Ryan    16 年前

    最简单的答案是保护该方法。这允许继承者调用它,但不会使其公开可用。但是,没有什么可以阻止继承类将方法更改为public。

        5
  •  2
  •   Tom Ritter    16 年前

    这是正确的方法。但在另一种情况下,您可能希望使用 editorbrowsableattribute 这将对intellisense隐藏该方法。您仍然可以调用它,但它会减慢开发人员调用可能破坏程序的东西的速度,并且通常会迫使他们阅读您的巨大评论警告。

        6
  •  1
  •   Stephan Leclercq    16 年前

    将其设置为受保护而不是公共,至少可以防止外部对象调用它。

        7
  •  1
  •   Michael Meadows    16 年前

    我在这里看到了代码的味道,因为验证不是船的功能职责的一部分。换句话说,我认为你可能在试图用继承来解决一个问题,而这可能不是最好的解决方案。尝试重构验证逻辑,以便将验证注入到类中。这对于域对象来说更有意义 Ship ,因为飞船不会自我验证,它们是在外部验证的。如果你想在那里强制执行 必须 如果属性为null,则可以抛出异常。

    protected IValidator FurtherValidation { private get; set; }
    
    public bool Validate()
    {
    //validate properties only found on a ship
    
        if (FurtherValidation == null)
            throw new ValidationIsRequiredException();
        if (!FurtherValidation.IsValid(this))
            // logic for invalid state
    }
    
        8
  •  0
  •   cfeduke    16 年前

    您可以将该方法标记为 protected

        9
  •  -1
  •   D. Rattansingh    16 年前

    也许你可以试试私人修饰符