- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我发现自己需要这样的东西:
// This could just as well be a concrete class.
//
// It is an interface for the sake of this example.
public interface Quark
{
void Do();
}
public class Strange : Quark
{
public virtual void Do()
{
// Something is done
}
public void DoSpecificThing()
{
MessageBox.Show("Specific Thing!");
}
}
public class Charm : Quark
{
public virtual void Do()
{
// Something else is done
}
public void DoAnotherSpecificThing()
{
MessageBox.Show("Another Specific Thing!");
}
}
在另一个文件中:
internal class ReUsableCode<BaseType> : BaseType // <- not allowed
{
public override void Do()
{
// Let's pretend this is around 2000 lines of
// 90's-style Win32 message spaghetti.
MessageBox.Show(base.GetType().ToString() + " did!");
base.Do();
}
}
public class LibraryStrange : ReUsableCode<Strange>
{
}
public class LibraryCharm : ReUsableCode<Charm>
{
}
在某个函数中:
LibraryStrange imStrange = new LibraryStrange();
LibraryCharm imCharmed = new LibraryCharm();
imStrange.Do();
imStrange.DoSpecificThing();
imCharmed.Do();
imCharmed.DoAnotherSpecificThing();
在 C++ 中,我只需要制作一个完全符合上述要求的模板。
由于上述原因,这在 C# 中是不可能的,而且多重继承也是不允许的。那么,如何在不复制和粘贴或强制一切都从单个基类继承的情况下重用词法相同的实现?
这是为了减少用户控件库所需的维护工作,这些控件全部继承自 System.Windows.Forms
中的内容,并且还以完全相同的方式覆盖 WndProc
方式(代码都是复制粘贴的,我正在努力消除或集中它)。
注意:我没有做大量的 C# 工作,所以如果这个问题看起来很初级或滥用了这个领域的术语,请原谅我。
最佳答案
我想出的最简单的解决方案是放弃继承以支持组合。不幸的是,它需要概括“SpecificThing”的概念。
问题恰恰在于 SRP和 ISP在你的设计中被违反了,你想出的一切都只是为了避免问题而不是解决问题的技巧!
您在评论中写下“问题中的“基本类型”[...]”——最好将其放在引号中——这些不应该是基本类型。然而,该表述过于笼统,很难明确指出哪里出了问题 - 这里似乎一切都是错误的。
public interface Quark
{
void Do();
}
public interface SpecificQuark : Quark
{
void DoSpecificThing();
}
public class Strange : SpecificQuark
{
public virtual void Do()
{
// Something is done
}
public void DoSpecificThing()
{
Console.WriteLine("Specific Thing!");
}
}
public class Charm : SpecificQuark
{
public virtual void Do()
{
// Something else is done
}
public void DoSpecificThing()
{
Console.WriteLine("Another Specific Thing!");
}
}
class ReUsableCode<T>
where T: SpecificQuark, new()
{
public T InnerQuark { get; private set; }
public ReUsableCode()
{
this.InnerQuark = new T();
}
public void Do()
{
// Let's pretend this is around 2000 lines of
// 90's-style Win32 message spaghetti.
Console.WriteLine(InnerQuark.GetType().ToString() + " did!");
this.InnerQuark.Do();
}
}
class LibraryStrange : ReUsableCode<Strange>
{
}
class LibraryCharm : ReUsableCode<Charm>
{
}
然后:
LibraryStrange ls = new LibraryStrange();
LibraryCharm lc = new LibraryCharm();
ls.Do();
ls.InnerQuark.DoSpecificThing();
lc.Do();
lc.InnerQuark.DoSpecificThing();
关于c# - C# 中的类模板实现 shim,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20230622/
我正在尝试使用更新的包重建项目但遇到此错误: [folatt@ArkOS-Dev genesis]$ ember build cleaning up... Build failed. The Broc
我正在尝试使用更新的包重建项目但遇到此错误: [folatt@ArkOS-Dev genesis]$ ember build cleaning up... Build failed. The Broc
鉴于以下情况: main.js var angular = require('angular'); 包.json { "main": "./main.js", "browser": {
我正在编写将一些数据放入分类帐的链码,然后尝试使用shim.GetStateByPartialCompositeKey()将其列出,并从迭代器中获取数据列表。现在,我想根据时间戳对数据进行排序(仅按日
我想为通用方法创建一个垫片。但在那种情况下,我对 Generic 有点麻烦。 这是我的例子: class BaseRepository where T: Entity { public T[
如主题所示。我的文件结构是: js/ |- bootstrap | |- module1 | |- module2 | |- jquery.min.js |- main.js 我的
该术语的官方解释是 es5-shim.js and es5-shim.min.js monkey-patch a JavaScript context to contain all EcmaScrip
它has been stated那: The shim allows for daemonless containers. It basically sits as the parent of the
据我了解,您可以使用 Requirejs 的填充程序来动态加载未在自己的文件中定义为模块的脚本。那么为什么我不能让这样一个简单的脚本工作呢? 这是我的非工作示例: /libs/test.js: var
我想将 bootstrap.js 和 jquery.js(均随 npm 安装)合并到vendors.js 文件中,但仍然可以通过调用 require('$') 来使用 jquery。所以我创建了 gu
我正在尝试获取与 magento 2 requirejs 一起使用的常量联系人脚本。 (我尝试将其内联添加,但它会发生冲突并导致错误) 他们的脚本需要数组 localizedErrMap 和 jQue
我发现自己需要这样的东西: // This could just as well be a concrete class. // // It is an interface for the sake
我正在尝试将现有应用程序分解为多个模块。我选择使用 Browserify 来做到这一点,因为它的语法很好地模仿了 NodeJS 的要求。 我的项目依赖于几个外部模块,其中之一是 Backbone。因此
我想将两个变量($ 和 jQuery)从 jquery 包传递到 persian-datepicker。因此,我添加了 $ 和 jQuery 作为 persian-datepicker 的依赖项。我所
我在 browserify-shim 和 bootstrap-datetimepicker 方面遇到问题。 Bootstrap-datetimepicker 需要 moment.js 但必须先加载此插
我想针对某些错误的网络行为测试存储库。我使用 MS Fakes 伪造了类(class),它看起来像这样: ShimInputRepository .AllInstanc
我在 vs 2015 上运行 angularjs2/TypeScript 项目 并按照 https://www.typescriptlang.org/docs/handbook/asp-net-4.h
我有一个测试方法,当我运行它时它很好,但在调试时失败并出现异常。下面是经过测试的方法和 VS Test Runner 的输出。异常来自 ShimsContext.Create() 信息:VS 2012
在为 BCL(或与此相关的任何库)中的类型成员创建垫片时。我们经常遇到这样一种情况,我们想要调用我们已经覆盖的原始方法(无论是在 shim 委托(delegate)内部还是外部)。例如: System
在 Visual Studio 2015 中,我有一个测试项目,我向其中添加了一个假程序集。 在单元测试本身中,我为静态泛型方法创建了一个垫片,该方法将实例返回到泛型类型,例如: using (Shi
我是一名优秀的程序员,十分优秀!