【问题标题】:C# Inheritance, adding new methods [closed]C# 继承,添加新方法 [关闭]
【发布时间】:2013-05-02 21:28:54
【问题描述】:

好的,所以我已经搜索了一段时间,试图找到这个问题的答案,但很难说清楚,所以我在这里问。

我正在继承一个类

Class A (int a, int b, int c)

public A(int a, int b, int c)
{
}

Class B : A 

public B(int a, int b, int c) base: (a, b, c)

public void blah(int something)
{

}

为什么我不能这样做然后再做:

B classb = new B(1,2,3);

classb.blah(4);

我必须这样做

public virtual void blah(int something)
{
}  

在A类,然后在B类:

public override void blah(int something)
{
 //method to be used in B but not A.
}

所以即使我不打算在 A 类中使用该方法,我仍然必须声明虚拟?所以如果我继承类 C : B 那么呢?我必须在 A 中为 C 声明东西?

【问题讨论】:

  • 我很确定你可以。您确定您发布的代码正确吗?
  • 您粘贴的代码甚至不接近有效的 C#。根本不清楚它试图传达什么。请修复您的示例代码。
  • 当我看到 tigrans 的响应时修复了它。在我的代码中,我实际上并没有使用这些特定的类名或方法名,我只是输入了一些近似于我正在做的事情。

标签: c# inheritance virtual


【解决方案1】:

这并没有什么问题,只是您的代码实际上不是有效的 C#。我想这就是你想要的:

class A
{
    public A(int a, int b, int c)
    {
    }
}

class B : A 
{
    public B(int a, int b, int c) : base(a, b, c)
    {
    }

    public void blah(int something)
    {
    }
}

那么这没问题:

B classb = new B(1,2,3);
classb.blah(4);

【讨论】:

    【解决方案2】:

    你的假设没有任何意义,至少在我理解的范围内。

    考虑以下示例:

    public class Base {}
    
    public class Derived : Base {
        public void DerivedSpecificMethod() {
        }
    }
    

    如果你这样做了

    Derived d = new Derived(); //as you specify in code example 
    d.DerivedSpecificMethod(); //you CAN do this.
    

    virtual 写的时候可能需要用到:

    Base b = new Derived(); //note, I use a Base here on left side of equation
    b.DerivedSpecificVirtualMethod(); //virtual method call
    

    【讨论】:

    • 我的问题是我在做 A classb = new B(1,2,3)
    • @Tim:是的,在这种情况下,您可能需要虚拟关键字才能使其工作。
    • @Tim 你也可以做演员A classb = new B(1,2,3); ((b)classb).blah();。但是,这表明您需要在强制转换之前检查类型,或者您不必要地将变量声明为基本类型。
    【解决方案3】:

    为什么我不能这样做然后再做:

    B classb = new B(1,2,3);
    
    classb.blah(4);
    

    你绝对可以。除了代码中的语法错误之外,这根本没有问题。这是一个完整的示例,可以毫无问题地编译和运行。 (我同时修复了 blah 方法的命名约定违规问题。)

    using System;
    
    class A
    {
        public A(int a, int b, int c)
        {
        }
    }
    
    class B : A
    {
        public B(int a, int b, int c) : base(a, b, c)
        {
        }
    
        public void Blah(int something)
        {
            Console.WriteLine("B.Blah");
        }
    }
    
    
    
    class Test
    {
        static void Main()
        {
            B b = new B(1, 2, 3);
            b.Blah(10);
        }
    }
    

    【讨论】:

      【解决方案4】:

      您的代码无法编译。您不必使用 virtual 说明符,这可以按预期工作:

      class App
      {
          static void Main()
          {
              B classb = new B(1,2,3);
              classb.blah(4);
          }
      }
      
      class A
      {
          public A(int a, int b, int c)
          {
          }
      }
      
      class B : A 
      {
          public B(int a, int b, int c): base (a, b, c)
          {
          }
      
          public void blah(int something)
          {
              Console.WriteLine(something);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-06
        • 2019-06-21
        相关资源
        最近更新 更多