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中公开一个新的公共属性