c#inheritance:更改派生类中的字段数据类型和值

时间:2017-11-05 17:22:49

标签: c# oop inheritance

是否可以在派生类中更改基类字段数据类型和值,仍然可以调用基类方法但是使用派生类值?

示例代码:

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原则,但你知道,人们有时会对此感到困惑,就像我一样: - )

2 个答案:

答案 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。