简体   繁体   中英

C# casting of derived class

A noob question...

I've got two classes, a common(parent) one and a specialized(child)one :

public abstract class BaseTest
{
   public BaseTestSettings Settings{get;set;}
   public abstract void Run();
}

public class BaseTestSettings
{
   public double SettingsProp1{get;set;}
   public double SettingsProp1{get;set;}
}

public class SpecializaedTestSettings : BaseTestSettings
{
   public double SpecializaedTestSettingsPropA{get;set;}
   public double SpecializaedTestSettingsPropB{get;set;}
}

public class SpecializaedTest : BaseTest
{
   public SpecializaedTest()
   {
      this.Settings = new SpecializaedTestSettings();
   }

   public override void Run()
   {
      SpecializaedTestSettings settings = (SpecializaedTestSettings)this.Settings;
   }
}

Is there a way to avoid casting in the overridden Run method in the specialized test ? I guess a solution would be to define a Settings property of type SpecializedTestSettings in the SpecializedTest class, but my goal is to avoid to this and declare those properties only once. I guess I can't ?

Use Generics :

public abstract class BaseTest<TSettings> where TSettings : BaseTestSettings
{
   public TSettings Settings{get;set;}
   public abstract void Run();
}

public class BaseTestSettings
{
   public double SettingsProp1{get;set;}
   public double SettingsProp1{get;set;}
}

public class SpecializaedTestSettings : BaseTestSettings
{
   public double SpecializaedTestSettingsPropA{get;set;}
   public double SpecializaedTestSettingsPropB{get;set;}
}

public class SpecializaedTest : BaseTest<SpecializaedTestSettings>
{
   public SpecializaedTest()
   {
      this.Settings = new SpecializaedTestSettings();
   }

   public override void Run()
   {
      SpecializaedTestSettings settings = this.Settings;
   }
}

If you need a non generic/covariant version you can write a covariant interface or a non generic base type.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM