C#Cast Class to Overridden Class

时间:2012-07-09 20:27:06

标签: c# class override

我有一个类Application,我需要用INotifyPropertyChanged事件覆盖它。我编写了覆盖原始类的逻辑,最终创建了SuperApplication

我从库中提取数据,但无法更改加载逻辑。我只需要一种方法将原始类中的数据导入我的superClass。我尝试过像superClass = (SuperApplication)standardClass;这样的东西,但它没有用。

我该怎么做呢?

如果有帮助,这就是我用来覆盖原始类的代码:

public class SuperCreditApplication : CreditApplication
{
    public SuperCreditApplicant Applicant { get; set; }
    public SuperCreditApplicant CoApplicant { get; set; }
}

public class SuperCreditApplicant : CreditApplicant
{
    public SuperProspect Prospect { get; set; }
}

public class SuperProspect : Prospect, INotifyPropertyChanged
{
    public State DriverLicenseState
    {
        get
        {
            return DriverLicenseState;
        }
        set
        {
            DriverLicenseState = value;
            OnPropertyChanged("DriverLicenseState");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

4 个答案:

答案 0 :(得分:0)

听起来你应该使用一个复制构造函数,将“原始类中的数据”作为参数传递给新构造的superClass(顺便提一下,我认为名称Super - 是可能是一个错误,因为这会让人们认为它高于层次结构中的原始文件。

通过copy-constructor,我的意思是:

class IWishIWasntCalledSuperApplication : Application 
{
  IWishIWasntCalledSuperApplication(Application original) 
  { 
      this.someData = original.someData;
      this.someOtherData = original.someOtherData;
      ...etc...
  }
}

答案 1 :(得分:0)

我认为您不能直接在INotifyPropertyChanged上实施Prospect。如果您无法直接更改Prospect(例如制作所有属性virtual),则可以将SuperProspect类设为Prospect

的包装器
public class SuperProspect : INotifyPropertyChanged
{
    private readonly Prospect _prospect;

    public SuperProspect(Prospect prospect)
    {
        _prospect = prospect;
    }

    public State DriverLicenseState
    {
        get { return _prospect.DriverLicenseState; }
        set
        {
            _prospect.DriverLicenseState = value;
            OnPropertyChanged("DriverLicenseState");
        }
    }

    public void SomeMethod()
    {
        _prospect.SomeMethod();
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

然后您可以像这样使用SuperProspect

var superProspect = new SuperProspect(myProspect);

如果您为Prospect成员创建了界面,则可以使SuperProspectProspect实现相同的界面。如果您然后编程到界面而不是具体的Prospect实现,那么您的代码将适用于SuperProspect和/或Prospect

答案 2 :(得分:0)

鉴于你的评论和编辑,我需要给出一个新答案大声笑 - 我误解了

您需要使用拦截将事件处理程序添加到您无法控制的属性。就个人而言,我已经看到过使用像棱镜这样的IoC容器。我可能在这里完全错了,但我认为MEF也可以提供帮助

另一种方法是使用T4模板查看代码生成,以反映现有类以生成超类以及映射到4existing的属性,这些属性将包含触发事件的代码。

这看起来像 http://lostechies.com/derekgreer/2009/03/01/implementing-inotifyproperychanged-with/

解释MEF的事情:我很确定我已经看到在各种Silverlight示例中使用MEF连接的INotifyPropertyChanged。我读书时对这方面不感兴趣,所以没有读过它。

提取界面并使用ioc容器完成所有繁重的操作将是我想象的最短路径。

答案 3 :(得分:0)

您没有说明负载是在构造对象期间还是在以后的方法调用期间。根据具体情况,它看起来就像这两个代码示例中的一个。

//This constructor signature should match your base class's
public SuperCreditApplication(object a, object b, object c) : base(a,b,c)
{
    //Do whatever you need to do here. The base object's constructor will be called for you
}

public Load()
{
    this.BaseObjectLoadMethod();
}

然后你创建一个新的SuperCreditApplication并使用它。