我正在实现一个使用复合设计模式的菜单系统.我有以下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++中我知道当一个打算从基类继承时,通常应该使用虚拟析构函数.但是,使用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#制作虚拟析构函数?
我目前有一个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结构?我必须做一个构造函数吗?
假设我有一个使用内置类型的程序,例如float,我希望能够为我的编译器提供命令行参数以将所有float声明更改为fixed_point<8,8>。
假设它们是完全相同的接口(例如,它们可以在赋值/加法/转换/等方面被相同对待),是否有办法通过编译器或构建系统(cmake/scons/等)进行交换指定特定标志时编译期间的类型?例如,这将有助于确定性方面的一些好处。
c# ×3
c++ ×1
compilation ×1
delegates ×1
events ×1
inheritance ×1
interface ×1
struct ×1
syntax ×1