gpt4 book ai didi

c# - 当涉及到抽象类时,在 C# 中正确分配适当的修饰符

转载 作者:太空狗 更新时间:2023-10-30 01:29:42 26 4
gpt4 key购买 nike

我遇到过很多次这种情况,并且已经“破解”了这种情况,但我的理解似乎存在差距。

给定以下代码:

public class Foo
{
Bar barA = new BarA();

private void Bat() => barA.Baz();
}

public abstract class Bar
{
// Obviously this *can't* be private
private abstract Baz();
}

public class BarA : Bar
{
public void Run() => Baz();

// Again this can't be private
private override Baz() => DoSomething();
}

(警告:为了简洁起见,我在示例中使用了表达式主体方法。通常我不会这样做,除非有充分的理由。)

现在,在上面的例子中,我的逻辑是 Baz 方法需要由具体类定义,但是我希望它私有(private)的原因(是的,我明白为什么它不能'不会,因为它对具体类来说是完全不可见/不可访问的),从逻辑上讲,我不希望具体类能够调用该方法,而只是定义它。

修复代码的方法是使方法 protected ,然后该方法就可以从具体类中执行。

最终,我想要一个抽象/基类来处理执行一些由具体类定义的代码的内部结构,但是具体类本身永远无法调用/执行。该逻辑有什么缺陷,或者我应该如何正确实现该逻辑。

** 编辑:具体实现 **

例如,假设这是库中插件系统的一部分(我正在创建,另一个开发人员正在实现)。库的另一部分使用实现此抽象类的派生类(假设它是图像处理中的过滤器)。开发人员定义了过滤器做什么的方法,但是抽象类(基本上处理定义的过滤器提供的唯一处理),是的,契约(Contract)(接口(interface))是为图像处理器制定的,所以它不需要(需要)无论如何都知道/关心实现。

最佳答案

就像我在评论中所说的那样,您想要做的是有点代码味道。如果您的派生类需要定义基类中的某些内容的工作方式,请考虑将接口(interface)传递给基类。这样你就不会暴露任何你不需要的公共(public)方法,并使事情更容易测试。你可以这样做。

接口(interface)和实现:

public interface IBaz
{
void Baz();
}

public class BigBaz : IBaz
{
public void Baz() => Console.WriteLine("Big Baz!");
}

现在你的代码稍微修改一下:

public abstract class Bar
{
private readonly IBaz _baz;
public Bar(IBaz baz)
{
_baz = baz;
}

public void DoBaz() => _baz.Baz();
}

public class BarA : Bar
{
//Here I'm passing into the constructor, but you may find it preferable
//to pass the IBaz directly as a parameter of the DoBaz method
public BarA() : base(new BigBaz())
{
}
}

关于c# - 当涉及到抽象类时,在 C# 中正确分配适当的修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50296406/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com