C# 重构我的代码:避免在派生类中强制转换

C# 重构我的代码:避免在派生类中强制转换,c#,refactoring,C#,Refactoring,首先,我对标题感到抱歉,我不知道如何准确描述我的问题。我希望通过代码可以更好地解释它 public abstract class AB { public MyModel Model; } public class A : AB { public A() { Model = new MyModelA(); } public void AMethod() { var model = (MyModelA) model; // I have to do this al

首先,我对标题感到抱歉,我不知道如何准确描述我的问题。我希望通过代码可以更好地解释它

public abstract class AB {
  public MyModel Model;
}

public class A : AB {
  public A() {
    Model = new MyModelA();
  }

  public void AMethod() {
    var model = (MyModelA) model; // I have to do this all place
  }

  public void AnotherMethod() {
    var model = (MyModelA) model; // same here
    model.NewInt = 123;
  }
}

public abstract class MyModel {

}

public class MyModelA : MyModel {
  // new properties
  public int NewInt {get;set;}
}
看一看代码,为了使用派生类的新属性,我必须执行强制转换,但当我必须在所有地方同时使用它时,这很难看

我认为该方法是声明另一个属性:
public MyModelA\u tmp
,然后在构造函数
\u tmp=(MyModelA)Model
中强制转换它,并使用它代替Model

还有其他合适的方法吗?
谢谢

可以将基类设置为泛型:

public abstract class ServiceBase<TModel> where TModel : new() {
    protected ServiceBase() { Model = new TModel(); }
    public TModel Model { get; private set; }
}

public class AService : ServiceBase<MyModelA> {
    ...
}
公共抽象类ServiceBase,其中TModel:new(){
受保护的ServiceBase(){Model=new TModel();}
公共TModel模型{get;private set;}
}
公共类AService:ServiceBase{
...
}

您可以在派生类中维护模型引用:

public abstract class AB {
  public MyModel Model;
}

public class A : AB {
      MyModel MyModel;

  public A() {
            MyModel = new MyModelA();
            Model = MyModel;
  }

  public void AMethod() {
            //just use MyModel
  }

  public void AnotherMethod() {
    MyModel.NewInt = 123;
  }
}

public abstract class MyModel {

}

public class MyModelA : MyModel {
  // new properties
  public int NewInt {get;set;}
}

使用_tmp的解决方案使您不必一直编写手动强制转换,但奇怪的对象设计问题仍然存在

我猜您的NewInt是为了执行MyModel中也存在的某种功能(否则您最好先创建一个新类)。我想知道您是否能够以MyModelA不必公开任何新内容的方式封装该功能。这可能意味着改变AB的定义,以允许这种概括


我相信,如果不理解这个领域,在OOP模式中,答案既不是语法上的,也不容易找到。也许你可以提供一些细节。

抽象类应该有
受保护的
构造函数。这对处理传递给服务的TModel可能有NewInt或没有NewInt这一事实有什么帮助?非常好的解决方案,我喜欢这个:)非常感谢!是的,但我认为他没有首先引入一个新领域是有原因的(即MyModelA仍然必须扮演MaModel的角色),看起来这是我的解决方案的一个更干净的版本,没有使用cast,但仍然是相同的想法。是的,你问过如何避免施放:)Ok well SLaks答案很好地提供了一个领域不可知的答案,所以我最后的答案可能是错误的。尽管如此,还是有必要研究为什么必须在MyModelA中公开一个新的公共属性