【问题标题】:I need some advice with inheritance and downcast我需要一些关于继承和沮丧的建议
【发布时间】:2014-09-10 09:07:30
【问题描述】:

我需要一些关于继承和转换的帮助:

public Class1 { public int myVar1;}
public Class2 : Class1 { public int myVar2;}

public void MyMethod(){ 
    Class1 myC1 = new Class1() { myVar1 = 10;} 
    Class2 myC2 = new Class2() { myVar2 = 15;}
    // What i should do here to achieve next
    Console.WriteLine(myC2.myVar1); // myVar1 = 10
}

我想做的是从myC2获取10myVar1值,这样当我调用myC2.myVar1时它是10,当我调用myC2.myVar2时它是15

有可能实现吗?

【问题讨论】:

  • 不确定我明白你想要什么。 myC1myC2 是两个不同的实例(它们不共享字段)。如果您希望 myC2.myVar1 为 10,则必须将其分配到某个位置:myC2.myVar1 = 10;myC2.myVar1 = myC1.myVar1;。我也不明白这与向下转换有什么关系。
  • Class1 是 Class2 的基类,当我为基类实例赋值时,我应该如何转换为派生类,以便派生类保留这个值
  • 您不能将基类分配给派生类。考虑Cat x = new Mammal() 它不会起作用,因为它不是是一只猫。但是,您可以将派生类分配给基类Mammal y = new Cat(),因为它 哺乳动物,然后您可以将其分配给Cat x = (Cat)y 之后的派生类;因为它一只猫。我们必须显式地强制转换(将类型名称放在括号中),因为它是一个缩小的强制转换,如果例如Cat x = (Cat)(new Dog()) 有效但不起作用,因为 Dog 不是 Cat。
  • 解释清楚,谢谢;)

标签: c# class inheritance


【解决方案1】:

myC2.myVar1 的值为 0,因为您没有设置它,int 字段默认为 0

如果你想让myC2.myVar1 成为10,那么设置它:

var myC2 = new Class2{myVar1 = 10, myVar2 = 15};

myC1.myVar1 设置为 10 不会影响它,因为它完全是另一个实例。正如您可以称为 Dimitri 而我可以称为 Jon,因为我们是不同的人,所以我们的 Name 属性不会相互覆盖。

也许你可以通过根本不创建Class1 来获得你想要的效果;如果你使用:

var myC2 = new Class2{myVar1 = 10, myVar2 = 15};
Class1 myC1 = myC2;

那么它们myC1myC2 将是对完全相同实例的两个引用,因为在基类型的变量中保存对对象的引用是合法的。

【讨论】:

  • 我知道设置继承变量或保持派生类引用,但如果我只有两个实例,一个是基类,一个是派生类,我取并分配给一个实例的变量基类 5,而不是当我去调用这个继承派生类的变量时我应该做的是 5。
  • 对不起,我没关注你。
【解决方案2】:
Class2 myC2 = new Class2 { myVar1 = 10; myVar2 = 15;}

您已经创建了完全独立的实例。从上面,您应该可以只调用 myC2.myVar1 和 myC2.myVar2 来检索这些值。

由于“Class2”实例继承“Class1”,“Class2”包含“Class1”字段。

【讨论】:

    【解决方案3】:

    您可能希望将Class1 定义为:

    public class Class1
    {
      public Class1()
      {
        myVar1 = 10;
      }
      public int myVar1;
    }
    

    所以当Class1构造函数被执行时,myVar1的默认值为10。

    【讨论】:

      【解决方案4】:

      您可能想要几个非常不同的东西,但这似乎符合您的描述

          public class Class1 
          {
              internal static int Myvar;
              private int _myVar;
              public int MyVar1
              {
                  get{return this.GetType().IsSubclassOf(typeof(Class1)) ? Myvar : _myVar;}
                  set{_myVar = value;Myvar = value;}
              }
          }
          public class Class2 : Class1
          {
              public int MyVar2 { get; set; }
          }
      

      如果你有

      var myC1 = new Class1 { MyVar1 = 10 };
      var myC2 = new Class2 { MyVar2 = 15 }; //myC2.MyVar1 = 10
      var myC3 = new Class1 { MyVar1 = 11 }; //myC2.MyVar1 = 11; myC1.MyVar1 = 10
      

      【讨论】:

      • 我以前写过它作为多重继承的一个例子。
      • 如果我将基类实例的变量personAge设置为40,假设他们都是40岁,应该怎么做?
      • @Dimitri 示例 1 设置默认值。示例 2 设置了可以在执行期间更改的默认值。
      • 我不想在基类中使用默认值或静态字段,我想要实现的是,当我为基类的实例变量赋值时,这个值会自动分配给派生类实例中基类的继承变量。
      • @Dimitri 创建的版本 4 应该可以满足您的期望。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-19
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      • 1970-01-01
      • 2017-09-28
      • 1970-01-01
      相关资源
      最近更新 更多