- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试使 Mixin 模式适合我的问题,但我有一个多态性问题,我不知道如何有效解决。在尝试重新设计我的程序之前,我想征求您的意见(也许有一些我不知道的很酷的 C++ 功能)。
我想以非常直接和简单的方式展示它,所以这里的用例可能没有意义。
我只有一个 Window
类
struct WindowCreateInfo {
std::string title;
int x, y;
int width, height;
};
class Window {
public:
Window(const WindowCreateInfo &createInfo) :
title(createInfo.title),
x(createInfo.x),
y(createInfo.y),
width(createInfo.width),
height(createInfo.height) {}
const std::string &getTitle() const { return title; }
int getX() const { return x; }
int getY() const { return y; }
int getWidth() const { return width; }
int getHeight() const { return height; }
public:
protected:
std::string title;
int x, y;
int width, height;
};
然后我定义了两个mixins Resizable
和 Movable
如下
template<class Base>
class Resizable : public Base {
public:
Resizable(const WindowCreateInfo &createInfo) : Base(createInfo) {}
void resize(int width, int height) {
Base::width = width;
Base::height = height;
}
};
template<class Base>
class Movable : public Base {
public:
Movable(const WindowCreateInfo &createInfo) : Base(createInfo) {}
void move(int x, int y) {
Base::x = x;
Base::y = y;
}
};
接下来,我有一些业务层,我在其中处理 Window
的实例。
class WindowManager {
public:
static void resize(Resizable<Window> &window, int width, int height) {
window.resize(width, height);
// any other logic like logging, ...
}
static void move(Movable<Window> &window, int x, int y) {
window.move(x, y);
// any other logic like logging, ...
}
};
这里明显的问题是下面的不编译
using MyWindow = Movable<Resizable<Window>>;
int main() {
MyWindow window({"Title", 0, 0, 640, 480});
WindowManager::resize(window, 800, 600);
// Non-cost lvalue reference to type Movable<Window> cannot bind
// to a value of unrelated type Movable<Resizable<Window>>
WindowManager::move(window, 100, 100);
};
我知道 Movable<Window>
之间存在差异和 Movable<Resizable<Window>>
因为后者Movable
可以使用 Resizable
.在我的设计中,混入是独立的,它们混入的顺序无关紧要。我想这种 mixin 的使用很常见。
有没有什么方法可以让这段代码编译,同时尽可能保持设计?
最佳答案
Is there any way how to make this code compile while keeping the design as much as possible?
您可以简单地让窗口管理器接受任意版本的Resizable<>
。和 Movable<>
通过模板化方法:
class WindowManager {
public:
template<typename Base>
static void resize(Resizable<Base> &window, int width, int height) {
window.resize(width, height);
// any other logic like logging, ...
}
template<typename Base>
static void move(Movable<Base> &window, int x, int y) {
window.move(x, y);
// any other logic like logging, ...
}
};
关于C++:混入和多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53659840/
我一整天都在用谷歌搜索这个,但我将不得不求助于社区。我将此代码放在一个单独的文件中,其中包含其他几个类。 const withExponents = function (obj) { return
我使用模块模式已有一段时间了,但最近开始想将函数和属性混入其中以增加代码重用。我已经阅读了一些关于这个主题的好资源,但对于最佳方法仍然有点不确定。这是一个模块: var myModule = func
我正在尝试使用 LESS 编写动态混合以根据 ID 自动生成 CSS。 LESS 有可能吗? // Variables @body-margin: 50px; @body-margin-tablet:
我需要能够使用 CSS 变量,因为我需要有悬停效果(背景颜色)才能由我的 VueJs 应用程序自定义。但是我的 CSS 样式表应该有一个默认值,它存储在一个嵌套的 SCSS 映射中。 (map-get
我尝试通过传播 operator 语法将 getter 混合到 JS 对象中,但它似乎总是返回 null。 HTML: JS: "use strict"; const mixin =
我正在学习 Bootstrap 3 并尝试在屏幕尺寸为桌面时简单地更改 H1 标签的颜色。我想避免在我的 css 中使用设备宽度,所以我希望做一些像这样基本的事情,但它不起作用: @media (mi
我一直在阅读有关使用 Coffeescript 或纯 Javascript 的 Mixins 的资料,来源如下: http://arcturo.github.com/library/coffeescr
我正在使用 Vue.js 构建 SSR 应用程序。 当我尝试 this 时遇到 typescript 错误. Vue.mixin({ beforeRouteUpdate (to, from,
我在我的 Angular 元素中遇到了这个错误。 @include for-desktop-up {...." No mixin named for-desktop-up" 我在 styles.scs
我已经为自己编写了一些使用此标准语法的 mixins,它真的很有帮助。但如果某个值出现,我想隐藏一些代码。 这是有效的(断点是假的,~"" 代码是默认告诉 LESS 编译为空): // LESS MI
例如假设我有 interface ICar {...} class Car implements ICar {...} 在 Scala 中我想做的事 new MyScalaClass with ICa
我是一名优秀的程序员,十分优秀!