是否可以在派生类中更改基类字段数据类型和值,仍然可以调用基类方法但是使用派生类值?
示例代码:
public class class1
{
protected DBContext DB { get; set; }
public A()
{
DB = new DBContext();
}
public virtual DBRecord find(int id)
{
return DB.DBRecord.Find(id);
}
}
public class class2 : class2
{
protected DifferentDBContext DB { get; set; }
public B()
{
DB = new DifferentDBContext();
}
}
然后我尝试使用下面的代码调用该方法。
class2 x = new class2();
x.find(1); // calls the base class method with base class field values
基于发生的事情,它使用基类变量调用基类方法。我想知道是否可以在派生类中设置字段类型/值然后调用基类方法?因为他们只有相同的实现,只是使用不同的值。
到目前为止我所做的事情(我认为这是多么冗余)和工作。
public class class2 : class1
{
//Other implementations omitted
public override DBRecord find(int id)
{
return DB.DBRecord.Find(id);
}
}
注意:这可能只是一个简单的OOP原则,但你知道,人们有时会对此感到困惑,就像我一样: - )
答案 0 :(得分:2)
您应该使用db上下文的接口或db上下文的基类。
public interface IDbContext{}
public class ContextA : IDbContext{}
public class ContextB : IDbContext{}
public class A
{
protected IDbcontext DB { get; set; }
public A(IDbcontext db)
{
DB = db;
}
}
public class B : A
{
public B():this(new ContextB(){}
public B(IDbcontext db):base(db){}
}
有些类似的方法,对继承的上下文也有类似的方法。
另一种方法可以是创建一个抽象基类,基类通过接口或继承再次请求dbcontext。
答案 1 :(得分:1)
这样做的方法是在基类中使您的属性成为虚拟:
public class class1
{
protected virtual DBContext DB { get; set; }
...
}
然后在派生类中覆盖它:
public class class2 : class2
{
protected override DifferentDBContext DB { get; set; }
...
}
这假设DifferentDBContext是一个DBContext。