Tech-Note For DKMILAN™

Entries Tagged as '钟情技术'

C#中的多态:visual、override 与 new

六月 6th, 2008 · No Comments

{ZHUAXIAead3dc42408ec383161c818b0f5bad3eUnion}

今天金山笔试,出了这么一道题,做题的途中忽然想到了Blog好久不更新了。。。。汗,溜号啊

[coolcode lang="cpp"]
public abstract class A
{
public A()
{
Console.WriteLine(’A');
}
public virtual void Fun()
{
Console.WriteLine(”A.Fun()”);
}
}
public class B: A
{
public B()
{
Console.WriteLine(’B');
}
public new void Fun()
{
Console.WriteLine(”B.Fun()”);
}
public static void Main()
{
A a = new B();
a.Fun();
}
}
[/coolcode]

结果是

A
B
A.Fun()

结果倒是显而易见,不过我想起刚看C#时,对于visual\override\new的区别来着,当时就有点糊涂。

MSDN的解释是这样的

在 C# 中,派生类可以包含与基类方法同名的方法。

  • 基类方法必须定义为 virtual。
  • 如果派生类中的方法前面没有 new 或 override 关键字,则编译器将发出警告,该方法将有如存在 new 关键字一样执行操作。
  • 如果派生类中的方法前面带有 new 关键字,则该方法被定义为独立于基类中的方法。
  • 如果派生类中的方法前面带有 override 关键字,则派生类的对象将调用该方法,而不是调用基类方法。
  • 可以从派生类中使用 base 关键字调用基类方法。
  • override、virtual 和 new 关键字还可以用于属性、索引器和事件中。

当时是相当的糊涂了。啥玩意,多态咋还出来一个new呢

后来慢慢理解了。。。

visual是override的前提与基础,既只有在基类的函数是visual的情况下,你才能在子类中override,否则编译会报错

new则是跟基类没多大关系的,除了名字相同之外。它独立于基类,相当于在子类中添加了一个新的方法。

我写了一个更合适的例子

[coolcode lang="cpp"]
public abstract class A
{
public void F()
{
System.Console.WriteLine(”A.F”);
}
public virtual void G()
{
System.Console.WriteLine(”A.G”);
}
}
public class B:A
{
public new void F()
{
System.Console.WriteLine(”B.F”);
}
public new void G()
{
System.Console.WriteLine(”B.G”);
}
}
public class C:A
{
public new void F()
{
System.Console.WriteLine(”C.F”);
}
public override void G()
{
System.Console.WriteLine(”C.G”);
}
}
class Program
{
static void Main(string[] args)
{
B b = new B();
C c = new C();
A a = b;
A d = c;
a.F();
a.G();
b.F();
b.G();
c.F();
c.G();
d.F();
d.G();
Console.Read();
}
}
[/coolcode]

结果如下

A.F
A.G
B.F
B.G
C.F
C.G
A.F
C.G

值得注意的是d的调用,因为C的G()实现是override,因此c.G()隐藏了A.G(),输出结果就是c的输出结果,而b的G()实现是new,独立于基类,因此A.G()并没有被覆盖,a调用是仍然是调用的的A自己的G(), b调用的是new G().

Tags: .Net编程

C#实现支持插件与二次开发的应用程序编写

五月 23rd, 2008 · 1 Comment

这两天一直在研究这个插件功能的实现,总结一些心得吧。

首先是应该定义插件应该实现的接口,接口里面是插件需要实现的功能与提供的内容。我是这么设计的:

首先是建立一个新的类库,用于把我们支持的插件的类型都以接口的形式放进去。比如我现在为我的Service Master设计了以下几个插件类型:外观插件,功能插件,系统信息插件,其他类型插件。目前接口设计如下

2008-5-24-0000

然后在原有的软件项目(ServiceMaster)中添加了一个插件检测的类,这个类用于检测已经放到Plugin文件夹下的插件。

(全文…)

Tags: .Net编程 · 系统服务优化专家

FetionVM:摆脱DotNetFW的镣铐

五月 12th, 2008 · 3 Comments

学.Net3年了,一直苦苦的寻找能让自己编写的几百KB,或者几MB的小东西离开20M的.Net Framework的方法。已知的方法都不是十分的合适,比如用Xenocode、Salamander .Net Linker这类东西,不是破解吗难找,就是不好用。现在终于找到了一个非常好用的方法~那就是飞信!!!

感谢中国电信,感谢飞信,感谢FetionVM.exe~~~

(全文…)

Tags: .Net编程 · IT业界

调用Windows API实现C#窗体阴影

五月 7th, 2008 · No Comments

做Service Master 1.7的时候,突然想起来我是不是也应该给这个朴素的软件加上一点花的东西,呵呵,于是,就觉得应该去做一个窗体的透明,此外还想实现带有阴影效果窗体,研究了一下WindowsAPI,最后觉得透明和淡入淡出完全可以不用WinAPI来实现的,API实现之后的结果跟修改Opacity属性的效果是完全一样的。只需要在窗体阴影中使用API实现。

这个是具体的WinAPI实现窗体阴影的效果
2008-5-8-0000.png

具体的代码如下
(全文…)

Tags: .Net编程

调用Windows API实现C#窗体透明代码

五月 7th, 2008 · No Comments

好久不写Blog了,这一个礼拜忙的要死,又是考试,又是数模,天天忙的要死,真是没有时间去弄Blog

这次把前一段时间更新Service Master时写的窗体透明代码贴到这里

WinAPI.cs类文件,Invoke & Wrap了窗体透明所需要的API函数:
(全文…)

Tags: .Net编程