C# 界面参数

C# 界面参数,c#,interface,C#,Interface,我对如何实现这一点有点困惑 我已经定义了一个名为IActivity的接口,它在int中有一些属性 然后我创建了两个类来实现这个接口,并添加了一些额外的属性 参与性和竞争性。为了清楚起见,这两个类实现了IActivity并声明了一些额外的属性 然后我有一个名为ActivitySvc的基类,它将为这两种类型的活动所共有的所有功能实现虚拟方法 然后,我实现了两个派生自基类的类,它们必须提供它们自己对基类中声明的SaveActivity方法的实现: public abstract void SaveAc

我对如何实现这一点有点困惑

我已经定义了一个名为IActivity的接口,它在int中有一些属性

然后我创建了两个类来实现这个接口,并添加了一些额外的属性

参与性和竞争性。为了清楚起见,这两个类实现了IActivity并声明了一些额外的属性

然后我有一个名为ActivitySvc的基类,它将为这两种类型的活动所共有的所有功能实现虚拟方法

然后,我实现了两个派生自基类的类,它们必须提供它们自己对基类中声明的SaveActivity方法的实现:

public abstract void SaveActivity(IActivity activity);
我的问题是,我在实现SaveActivity方法时出错,因为我的activity对象是IActivity类型,因此它没有特定于EngagementActivity和MPEngagementActivity类的成员

我做错了什么


提前感谢。

虽然这不一定是最好/最正确的方法,但最快的方法是尝试将活动对象安全地强制转换为相关方法中的正确类型

例如,在使用EngagementActivity的类中,可以执行如下操作:

public override void SaveActivity(IActivity activity)
{
    var engagementActivity = activity as EngagementActivity;
    if (engagementActivity != null) // it's the correct type
    {
        // Do whatever's needed here
    }
}

如果
engagementActivity
变量为null,则它不是您试图将其转换为的类型。有关“as”的更多信息,请参见。

虽然它不一定是最佳/最正确的方法,但最快的方法是尝试将活动对象安全地强制转换为相关方法中的正确类型

例如,在使用EngagementActivity的类中,可以执行如下操作:

public override void SaveActivity(IActivity activity)
{
    var engagementActivity = activity as EngagementActivity;
    if (engagementActivity != null) // it's the correct type
    {
        // Do whatever's needed here
    }
}

如果
engagementActivity
变量为null,则它不是您试图将其转换为的类型。有关“as”的更多信息,请参阅。

在SaveActivity中获取IActivity的基本类型并获取您的属性。 您可以在抽象类中定义不可重写的虚方法

public virtual void SaveActivity(IActivity activity)
{
    ...
    // some common code for all types
    if(activity is EngagementActivity)
    {
       // use explicit type casting '(EngagementActivity)activity' and get your properties
       // save your data
       return;
    }
    if(activity is MPEngagementActivity)
    {
       // use explicit type casting '(MPEngagementActivity)activity' and get your properties
       // save your data
       return;
    }
    // other activity types
    ...
    // if no case fired save data for common activity or throw exception for unknown type
}

在SaveActivity中获取IActivity的基本类型并获取您的属性。 您可以在抽象类中定义不可重写的虚方法

public virtual void SaveActivity(IActivity activity)
{
    ...
    // some common code for all types
    if(activity is EngagementActivity)
    {
       // use explicit type casting '(EngagementActivity)activity' and get your properties
       // save your data
       return;
    }
    if(activity is MPEngagementActivity)
    {
       // use explicit type casting '(MPEngagementActivity)activity' and get your properties
       // save your data
       return;
    }
    // other activity types
    ...
    // if no case fired save data for common activity or throw exception for unknown type
}

在使用接口时,您通常不关心底层数据是什么,只关心它实现了接口。听起来你好像在试图违反这一点。这些来自IActivity具体类的不同成员代表什么?与其尝试直接从SaveActivity方法访问它们,不如将其隐藏在EngagementActivity和MPEngagementActivity类中,并将逻辑封装到通过IActivity公开的公共方法中?使用接口时,您通常不关心底层数据是什么,只关心它实现了接口。听起来你好像在试图违反这一点。这些来自IActivity具体类的不同成员代表什么?与其尝试直接从SaveActivity方法访问它们,不如将其隐藏在EngagementActivity和MPEngagementActivity类中,并将逻辑封装到通过IActivity公开的公共方法中。我将SaveActivity方法声明为抽象方法,因为根据活动的不同,实现会有很大的不同,但是我确实实现了您关于将对象强制转换为正确类型的建议。我声明SaveActivity方法为抽象方法,因为根据活动的不同,实现方式会有很大不同,但我确实实现了您关于将对象强制转换为正确类型的建议。