Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#继承:更改派生类中的字段数据类型和值_C#_Oop_Inheritance - Fatal编程技术网

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

c#继承:更改派生类中的字段数据类型和值,c#,oop,inheritance,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 c

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

示例代码:

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

你应该使用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

实现这一点的方法是使您的财产在基类中成为虚拟财产:

public class class1 
{
  protected virtual DBContext DB { get; set; }
  ...
}
然后在派生类中重写它:

public class class2 : class1
{
  private DifferentDBContext DDB;
  protected override DBContext DB 
  { 
    get { return DDB; } 
    set { DDB = value is DifferentDBContext ? (DifferentDBContext)value : null; } 
  }
}

这是假设
differentitdbcontext
是一个
DBContext

我问这个问题的原因是我发现在我试图做的事情中有很多机会会发生这种情况,我不能一遍又一遍地重复相同的代码。对不起,你能详细说明一下吗?我想我今天的信息过载了,因为我刚学的代码和概念发生了太多的变化,所以我想我错过了这一部分,或者只是以后会处理。我想这应该行得通我对OOP部分很陌生,比如“this(new Contextb()){}”,只是现在不能完全理解它们:-)为什么这被标记为正确答案?这在C#中是不可能的语法。请看,谢谢您的收看!更新后的代码应该可以工作。