- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有这个继承模型:
public class Animal
{
}
public class Dog : Animal
{
public static List<Action<Dog>> Augmenters = new List<Action<Dog>>();
}
public class Cat : Animal
{
public static List<Action<Cat>> Augmenters = new List<Action<Cat>>();
}
// in another place of the code, augmenters are added and configured
public static void Main (string[] args)
{
Dog.Augmenters.Add(dog =>
{
// doing something with dog
});
Cat.Augmenters.Add(cat =>
{
// doing something with cat
});
}
增强器在每个 Dog
/Cat
/etc 中都有很多静态代码。包括 null 检查、实例化、并发控制、性能调优等的类在所有派生类中完全相同。
狗增强器应该是静态的,因为它们适用于所有狗,而不仅仅是一只狗。猫增强器等也是如此。
但它们不能迁移到 Animal
类,因为每个派生类的扩充器都不同于其他类。如果我将 Augmenters
移动到 Animal
类,那么每个应该只属于猫的增强器也将应用于狗。
如何 DRY 这种样板代码?
我看到了something similar for C++在这里,它被称为CRTP .
最佳答案
让我试试擦干
class Program
{
public abstract class Animal<T> where T : Animal<T>
{
public static List<Action<T>> Augmenters = new List<Action<T>>();
}
public class Dog : Animal<Dog>
{
}
public class Cat : Animal<Cat>
{
}
// in another place of the code, augmenters are added and configured
public static void Main(string[] args)
{
Dog.Augmenters.Add(dog =>
{
Console.WriteLine("bark");
});
Cat.Augmenters.Add(cat =>
{
Console.WriteLine("meow");
});
Dog.Augmenters[0].Invoke(new Dog());
Cat.Augmenters[0].Invoke(new Cat());
Console.ReadLine();
}
}
添加了一个抽象方法并为其类型添加了约束,至少您不必在具体类中重复实现 Augementers。
关于c# - 如何在派生类中 DRY 静态重复样板代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55085365/
我正在创建一个 SSO 服务器,以将所有用户集中在 ActiveDirectory(AD) 中并在那里管理他们,而不是每个特定应用程序的数据库。 为了制作这个服务器,我使用了 IdentityServ
几天前,我了解了 HTML5 样板文件,所以我还是个新手。我正在尝试使用样板进行试验,所以我继续下载了这个 boilerplate 但我对下载选项的差异感到困惑。 有一个用于下载现成的自定义文件的按钮
在Flutter中,我们需要为在dispose()中创建的许多内容写下State,例如 final _nameController = TextEditingController(); @ov
我正在开发一个更大的项目,我对空检查有点厌倦。我有一个 MongoDB 实体(文档),该实体引用了另一个文档。几乎在每种情况下,我都会检查它是否为空,如果不是则执行某些操作。我知道 Java 8 中有
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
每次我向项目中添加新表单时,它都会在 use 子句中删除一大堆样板文件。 uses Windows, Messages, SysUtils, Variants, Classes, Graphics
这是我的Todo应用程序的基本结构,看起来像是“main.go”; package main import ( "encoding/json" "fmt" "log"
我有一个实现接口(interface)的类。还有另一个类也实现了这个接口(interface),并且第二个类的实例支持我的类的实现。 对于接口(interface)指定的许多方法,我的类只是将它们直接
每次我想要一个 SeekBar 和一个相应的 TextView 来显示它的数值时,为了减少代码的编写,我编写了以下抽象类: abstract public class SeekBarWrapper {
我正在考虑使用 CSS 样板(kube 或任何其他)来构建我的表单。它们在示例 html 文件中工作得很好,但是如果我想在不受控制的环境中使用(意味着 css 不在我的控制范围内),它会弄乱这些样式。
我很难在 CSS 中显示我的背景图片。我创建了一个带有 .top 类的 div,但每次我使用 background-image css 属性时,除了颜色、高度和宽度外什么都没有显示。我还使用 Init
尝试使用yarn导入react-image-crop包并将其添加到react样板中。 安装包后出现此错误 Module parse failed: /Users/...../frontend/node
我正在使用 skeleton 构建网站框架,使用 a fork that compiles from LESS . 在不丢失骨架提供的底层脚手架的情况下自定义样式的正确方法是什么?我知道我可以更改变量
从开箱即用的 HTML5 样板安装中,我使用以下代码 body { background-image:url('img/bg.png'); background-repeat:repeat-y; }
我正在使用 GWT 事件和地点框架来构建我的应用程序,结果很好。让我烦恼的一件事是 ActivityMapper实现是 (1) 接收应用程序中的所有 View (2) 包含一个巨大的 if/else
我正在使用generator-babel-boilerplate然后运行npm run test-browser。这可以正常工作,但我需要在浏览器中测试一些内容,并且我不确定如何查看正在提供的内容。
我经常使用以下样板,并希望将其消除。它看起来像这样: type Configured = ReaderT Config doSomething :: Configured IO Data doSome
我正在使用 ASP.NET 样板。我有一个 Angular 应用程序(ABP 外部),我想使用我的 API。 为此,我通过 /api/TokenAuth/Authenticate 获取访问 token
我的 JS 为: (function () { var controllerId = 'app.views.dashboard'; angular.module('app').cont
我们曾经可以输入 !在 vscode 中的 html 文档中获取 html boiler plate content completion as documented here . 然而它不再起作用。
我是一名优秀的程序员,十分优秀!