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

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

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 _tmp然后我将它转换为构造函数_tmp = (MyModelA) Model并使用它代替Model。

有没有其他适当的方法来做到这一点? 谢谢 !

您可以使基类通用:

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

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

 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中也存在的某种function(否则你最好先为它创建一个新类)。 我想知道你是否不能以MyModelA不必暴露任何新内容的方式封装该function。 这可能意味着改变AB的定义以便允许这样的概括。

我相信,答案在没有理解域的情况下,既不是语法也不容易在OOP模式中找到。 也许你可以提供一些细节。