繁体   English   中英

如何强制私有方法,因为接口方法只是公开的?

[英]How to enforce private method since interface methods are only public?

接口可用于强制实现方法,但它们需要公开。

如果我想强制执行私有方法怎么办?

更新:这不是关于阻止呼叫,而是关于确保私有方法已经实现。

所以我不想使用界面本身。 我想给团队强加一些编码风格。

接口总是公开定义。 强制执行受保护(私有到外部但可由派生类访问)方法的唯一方法是通过子类化定义该方法的抽象类:

public abstract class A
{
    protected abstract void Foo();
}

public class B : A
{
    protected override void Foo() { }
}

以上将打破,如果你想改变Foo的访问修饰符中B ,或忘了提供一个实现Foo()B

编辑:

我相信使用只对外部类可见的嵌套类可以实现接近你想要的东西:这将允许使用外部类的私有字段,同时强制执行接口,而技术上是类从其他任何地方都看不到:

public interface IFooWorker
{
    void DoWork();
    int CalculateSomething();
}

public class Foo
{
    private FooWorker _worker;
    private int _currentValue;
    private string _workStatement;


    public Foo()
    {
        _worker = new FooWorker(this);
    }

    private class FooWorker : IFooWorker
    {
        private Foo _outer;
        public FooWorker(Foo foo)
        {
            _outer = foo;
        }

        public void DoWork()
        {
            _outer._currentValue = CalculateSomething();
            _outer._workStatement = "I did work";
        }

        public int CalculateSomething()
        {
            return 42;
        }
    }

}

你为什么要通过界面口述私人方法? 各个类应该是黑盒子,接口只定义对该类的公共访问,不应该关注该类的私有内部,只关注公共方法以智能方式工作。 所以,我想我所说的是甚至都没有考虑过,因为这是一个荒谬的概念,完全违背了该语言的这个特性所要完成的事情。

对于所有意图和目的,对于包含它的类之外的代码,不存在私有方法。 它可以通过反射找到,但是......私有范围的整个含义不是对象API的一部分。 私有成员显然不是对象契约的一部分,它是封装在其中的东西。

你为什么要强迫其他开发人员“遵循编码风格”到那个级别的粒度? 什么是预期目的或期望的结果?

从另一个方向来看,你已经说了几次你想“确保方法得到实施”,或者说有什么效果。

如果你想对特定方法的签名采取行动,并确保它已经实现,你可以使用委托/ Func / Action并让外部代码注入其相应的实现。 您的内部代码可以检查它是否已被提供并调用它是否已经提供。 您知道存在一个方法来处理调用,因为您已经提供了对它的引用...即您知道某个地方已经实现了相应的方法。

如果你有一个直截了当的情况,并且你正在从内部逻辑到外部逻辑,那么你可以只使用事件。 创建事件args以包含您需要提供给附加处理程序的任何内容,使用泛型事件处理程序,并在您需要将控制权传递给外部逻辑的实现方法时,如果它不为null,则在内部逻辑中声明一个事件。 外部逻辑以正常方式挂钩事件并执行适合其使用的任何内容。 事件模型是契约的,对.NET来说非常自然,使用频繁,易于使用,并且许多开发人员非常熟悉该模式并知道如何插入它。

在我看来,你想要的“私人”方法合同不太可能为你带来成果,并且与OO设计背道而驰。

祝好运!

它不会是“私有的”,但您仍然可以使用显式接口实现来伪造它。

请参阅: http//msdn.microsoft.com/en-us/library/ms173157.aspx

但是,通过向上转换到接口类型,没有什么能阻止某人直接调用您的方法。 然后,私有方法是实现细节:它们不属于接口。

根据定义,接口是一组公共方法。 也许你想要一个抽象类。

这没有意义,因为无法调用在接口中声明的私有方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM