- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我遇到过很多次这种情况,并且已经“破解”了这种情况,但我的理解似乎存在差距。
给定以下代码:
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/
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
我有一个在 ab 时间内运行的算法,其中 a 和 b 都是单独的输入。 我的算法还是多项式时间复杂度算法还是nn?我认为 nn 不是多项式,但我仍然不确定。 我看到 n 算法的阶乘仍然评估为 nn 复
这个问题在这里已经有了答案: Logical operators (AND, OR) with NA, TRUE and FALSE (2 个回答) 1年前关闭。 由于“is.na(NA)”返回真,“
假设我有一个具有以下结构的 Pandas 数据框: df = pd.DataFrame(dict(a=["x", "x", "y"], b=[0, 1, 1], c=[1, 2, 2])) 我想按 a
谁能帮我处理一些相当复杂的 Django 查询? 这些是我的模型: class County(models.Model): name = models.CharField(max_length
我想从某个表中选择一行并根据另一个表对结果进行排序。 这是我的表: lang1_words: word_id - word statuses: word_id - status 在每个表中 word_
我是单元测试的新手,所以请对我宽容一些。我有一些查询 RESTful API 的模块。我发现在每个测试套件中,我都使用几行代码来启动一个简单的 ExpressJS Web 服务器,以模拟一些我可以从测
假设我有以下代码: var blinker = function(element){ if(stopped){ return; } else { var sampleMappi
我正在用 JavaScript 制作一个选择你自己的冒险风格的游戏,在本节中: evade = prompt("Go out of your way to avoid them, just in ca
我的代码: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Events1 extends
我正在使用 scipy ode 来解决钟摆问题。 from scipy import * import matplotlib.pyplot as plt from scipy.integrate im
我有一个 Google 表格,用于收集客户的注册数据。收集的数据包括学生的姓名、学生选择参加的类(class)以及信用卡号。提交后,我会收到通知。收到通知后,我会转到我的 Google 表格并从信用卡
我需要定义一个操作的两个版本,定义略有不同。它是一系列包含Nat指数的成分。 open import Data.Nat data Hom : ℕ → ℕ → Set where id : (
我正在研究游戏引擎 http://ducttape-dev.org使用 boost 作为依赖项之一。有一天,当我正在编写一个链接到我的游戏引擎的测试应用程序时,OgreProcedural 的 Ext
我正在 Android 中制作一个表达式计算器,所以我想在实际计算答案之前检查字符串是否符合有效表达式的条件。 我在 Java 中试过这个正则表达式: ^\s*([-+]?)(\d+)(?:\s*([
我有以下 postgresql 查询(为便于阅读而简化): select * from a_view where a in (select * from a_function(a_input))
我开始更好地掌握 PostgreSQL 索引,但我遇到了 OR 条件的问题,我不知道如何优化我的索引以加快查询速度。 我有 6 个条件,当单独运行时,它们的成本似乎很小。下面是修剪查询的示例,包括查询
有谁知道为什么下面的代码接受诸如123-123-1234这样的答案: [1-9]\\d{2}-[1-9]\\d{2}-\\d{4} 我想到了代码,它只接受先接受 2 个数字,再接受 2 个数字,然后再
在使用 Java 1.8u40 打开带有提示类型和附加的 StringConverter 的组合框时,我遇到了以下错误。这可以追溯到执行 FXML 的团队留下的示例字符串,与 Controller 中
在 MySQL 中,我有三个不同的数据库 - 我们将它们称为 A、B 和 C。 是否可以执行涉及所有三个数据库(A、B、C)中的表的事务? (所有数据库都在同一服务器上) 最佳答案 是的,你可以。这是
我是一名优秀的程序员,十分优秀!