C# 从内部SoundEffectInstance继承,未定义构造函数

C# 从内部SoundEffectInstance继承,未定义构造函数,c#,class,oop,inheritance,xna,C#,Class,Oop,Inheritance,Xna,我正在尝试创建一个新类FadableSoundEffectInstance,该类继承自SoundEffectInstance 我的FadableSoundEffectInance将允许SoundEffectInstances轻松淡入淡出,但是在完成课程后,我在这里得到了一个可爱的错误: 类型“Microsoft.Xna.Framework.Audio.SoundEffectInstance”未定义构造函数 经过一段时间的研究和对XNA来源的挖掘,我发现了这个 internal SoundEffe

我正在尝试创建一个新类
FadableSoundEffectInstance
,该类继承自
SoundEffectInstance

我的
FadableSoundEffectInance
将允许
SoundEffectInstances
轻松淡入淡出,但是在完成课程后,我在这里得到了一个可爱的错误:

类型“Microsoft.Xna.Framework.Audio.SoundEffectInstance”未定义构造函数

经过一段时间的研究和对XNA来源的挖掘,我发现了这个

internal SoundEffectInstance(SoundEffect parentEffect, bool fireAndForget)
{
...
}
所以它确实有一个构造函数,但我无法访问它

我如何解决这个问题才能创建我的类

注意:对于以前没有使用过XNA的人,您不会使用
blah=new SoundEffectInstance
创建新类,而是加载
SoundEffect
并使用方法
CreateInstance()
。另外,
SoundEffect
是一个密封类。另外,将构造函数添加到我的新类中会引发相同的错误,但对于
SoundEffectInstance

这是我的相关代码,以防您需要深入查看

FadableSoundEffectInstance

    public sealed class FadableSoundEffectInstance : SoundEffectInstance
    {
        public float FadeSpeed = .01f;
        public AudioFadeState FadeState = AudioFadeState.Normal;

        public void FadeOut()
        {
            //Logic
        }
        public void FadeIn()
        {
            //Logic
        }
        public void Update(GameTime gameTime)
        {
            //Logic
        }
    }
还有一个扩展方法,这样我就可以调用
SoundEffect.CreateFadableInstance()


您的问题不是唯一的。
您没有访问构造函数的权限,因此无法创建派生类。无论您是否使用XNA,这都是相同的

如果您想直接使用新的声音效果,可以创建一个伪装饰器,它接收实际的
SoundEffectInstance
并包装它


但是,如果您想将声音效果传递给需要
SoundEffectInstance

的XNA方法,这对您没有帮助。我通过向类中添加
SoundEffectInstance
来解决这个问题,而不是继承它,这可能不是最优雅的解决方案,但它是有效的

public SoundEffectInstance BaseInstance;
并将我的扩展方法更改为:

    public static FadableSoundEffectInstance CreateFadableInstance(this SoundEffect soundEffect)
    {
        return new FadableSoundEffectInstance(soundEffect);
    }
和我的类来处理声音效果,将其转换为
SoundEffectInstance
,并执行该类可能需要的任何初始化

    public FadableSoundEffectInstance(SoundEffect soundEffect, float fadeSpeed = .1f)
    {
        BaseInstance = soundEffect.CreateInstance();
        BaseInstance.Volume = 0;
        FadeSpeed = fadeSpeed;
    }

顺便说一句:
SoundEffectInstance
没有密封。@DanielHilgarth,对了,很抱歉。与XNA方法互操作的问题很容易解决:只需编写一个隐式转换运算符,返回底层的
SoundEffectInstance
@ColeCampbell:这有什么帮助?它将不再是一个淡出的声音。你希望XNA的内部代码调用使它淡出的淡出声音效果的新方法吗?也许我误解了你的意思。当您使用需要
SoundEffectInstance
的XNA方法时,它的衰落方面是不相关的。我的建议纯粹是为了方便起见,省去了通过属性公开底层
SoundEffectInstance
的步骤。
    public FadableSoundEffectInstance(SoundEffect soundEffect, float fadeSpeed = .1f)
    {
        BaseInstance = soundEffect.CreateInstance();
        BaseInstance.Volume = 0;
        FadeSpeed = fadeSpeed;
    }