C# 用受保护的方法装饰类

C# 用受保护的方法装饰类,c#,design-patterns,C#,Design Patterns,我想做与上面描述的完全相同的事情,但是用C# 我看了几个类似的问题,但没有一个真正告诉你如何解决这个问题。尝试用受保护的方法装饰类一开始是错误的吗?唯一的区别是受保护的方法可以在派生类中使用,而私有的方法不能。所以这不是一个对错的问题,而是一个你是否需要这个功能的问题 受保护的方法只对子类可见。如果Foo和Foo2在同一个组件中,您可以将Foo.Bar改为内部: public class Foo { internal void Bar() { ... } } 您可以将中间类设置为内部:

我想做与上面描述的完全相同的事情,但是用C#


我看了几个类似的问题,但没有一个真正告诉你如何解决这个问题。尝试用受保护的方法装饰类一开始是错误的吗?

唯一的区别是
受保护的
方法可以在派生类中使用,而
私有的
方法不能。所以这不是一个对错的问题,而是一个你是否需要这个功能的问题


受保护的方法只对子类可见。如果
Foo
Foo2
在同一个组件中,您可以将
Foo.Bar
改为内部:

public class Foo
{
    internal void Bar() { ... }
}

您可以将中间类设置为内部:

public interface IFoo { void DoSomething(); }

public class Foo : IFoo
{
    public void DoSomething() {}
    protected void Bar() {}
}

public class FooInternal : Foo
{
    internal void Bar()
    {
        base.Bar();
    }
}

public class Foo2 : IFoo
{
    private readonly FooInternal _foo;

    public Foo2(FooInternal foo) { _foo = foo; }

    public void DoSomething() {}

    protected void Bar()
    {
        _foo.Bar(); // can access Bar() from here
    }
}

关于
受保护的
的整个想法是,它只能在当前类及其子类中访问。在Java和C#中,您永远无法在仅包含对它的引用的类中访问它。相关问题,但您正在将Bar设置为公共方法。根据@Lee建议,您可以将此方法设置为内部方法。我已经更新了我的答案。谢谢,这似乎是一个合理的方法。
public interface IFoo { void DoSomething(); }

public class Foo : IFoo
{
    public void DoSomething() {}
    protected void Bar() {}
}

public class FooInternal : Foo
{
    internal void Bar()
    {
        base.Bar();
    }
}

public class Foo2 : IFoo
{
    private readonly FooInternal _foo;

    public Foo2(FooInternal foo) { _foo = foo; }

    public void DoSomething() {}

    protected void Bar()
    {
        _foo.Bar(); // can access Bar() from here
    }
}