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