小编The*_*kai的帖子

在接口中使用事件

我正在实现一个使用复合设计模式的菜单系统.我有以下MenuElement接口:

public interface MenuElement
{
    void AddMenuElement( MenuElement menuToAdd );
    void RemoveMenuElement( MenuElement menuToRemove );
    MenuElement GetMenuElement( int index );
    void Activate();
}
Run Code Online (Sandbox Code Playgroud)

我想在这个界面中包含一个"OnActivate"事件,以便实现此接口的MenuItems在激活时可以触发函数.我尝试像这样实现它:

public interface MenuElement
{
    public delegate void MenuEvent();
    event MenuEvent onActivate;

    void AddMenuElement( MenuElement menuToAdd );
    void RemoveMenuElement( MenuElement menuToRemove );
    MenuElement GetMenuElement( int index );
    void Activate();
}
Run Code Online (Sandbox Code Playgroud)

但是,编译器不允许我在接口内声明委托.我知道一个名为EventHandler的C#事件类型,但与我想要的MenuEvent不同,它需要object和EventArgs参数.我也考虑过移动我的事件并委托给MenuItem,但我仍然很好奇是否可以让界面包含自定义事件.

这可能吗?或者在这种情况下我是否必须使用C#的EventHandler类?

c# events delegates interface

5
推荐指数
1
解决办法
1430
查看次数

抽象类的析构函数

在C++中我知道当一个打算从基类继承时,通常应该使用虚拟析构函数.但是,使用C#我不知道该怎么做.请考虑以下代码:

public abstract class Character
{
    private string characterName;
    public int health;

    Character()
    {

    }

    ~Character(){

    }

    public virtual void SetCharacterName( string tempName )
    {
        characterName = tempName;
    }

    public virtual string GetCharacterName( )
    {
        return characterName;
    }
}
Run Code Online (Sandbox Code Playgroud)

(注意:我听说Unity的Unity3Ds实现与标准略有不同.也许忽略一些小的格式错误,代码似乎功能......)

我的第一直觉是将~Character()析构函数设为虚拟,将其定义为:

virtual ~Character(){

}
Run Code Online (Sandbox Code Playgroud)

但这样做会导致IDE返回错误.

在C#中,对于希望继承的抽象类,使用虚拟析构函数是必要的还是被认为是标准的?还是有其他方法用C#制作虚拟析构函数?

c# syntax inheritance virtual-destructor

4
推荐指数
2
解决办法
2628
查看次数

在结构中初始化列表

我目前有一个Match结构,其中包含一个Blocks列表.

public struct Match{
    public List<Block> blocks;
}
Run Code Online (Sandbox Code Playgroud)

当我尝试创建一个新的Match(在本例中,称为matchData)并将Blocks添加到其Block列表时,我的编译器输出:

Use of unassigned local variable 'matchData'
Run Code Online (Sandbox Code Playgroud)

我尝试通过这样做来初始化列表:

public struct Match{
    public List<Block> blocks = new List<Block>();
}
Run Code Online (Sandbox Code Playgroud)

这会导致以下错误:

Structs cannot have instance field initializers
Run Code Online (Sandbox Code Playgroud)

那么我应该如何初始化我的Match结构?我必须做一个构造函数吗?

c# struct initialization

1
推荐指数
1
解决办法
1026
查看次数

C++ 中的编译时类型替换

假设我有一个使用内置类型的程序,例如float,我希望能够为我的编译器提供命令行参数以将所有float声明更改为fixed_point<8,8>

假设它们是完全相同的接口(例如,它们可以在赋值/加法/转换/等方面被相同对待),是否有办法通过编译器或构建系统(cmake/scons/等)进行交换指定特定标志时编译期间的类型?例如,这将有助于确定性方面的一些好处。

c++ compilation

1
推荐指数
1
解决办法
78
查看次数