首页 / C# / C#中类似模板的实现垫片
C#中类似模板的实现垫片
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#中类似模板的实现垫片,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2819字,纯文字阅读大概需要5分钟。
内容图文
![C#中类似模板的实现垫片](/upload/InfoBanner/zyjiaocheng/678/f8a58f56d60145719474cbaa98ddc578.jpg)
我发现自己需要这样的东西:
// 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#中类似模板的实现垫片所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。