【问题标题】:When I inherit a method in C# and call the inherited method. Do I need to use base or this当我在 C# 中继承一个方法并调用继承的方法时。我需要使用基地还是这个
【发布时间】:2018-03-05 16:34:24
【问题描述】:

当我们在 C# 中继承一个方法时,它是如何调用它的最佳方式。有基地还是这个。下面是一些例子:

   class User
    {
        public void LogData()
        {
            Console.WriteLine($"Log data from user");
        }
    }

    class Admin : User
    {
        public void DeleteData()
        {
            // How is it right way to call that method?
            // base.LogData();
            // or
            // this.LogData();
            Console.WriteLine("Deleting");
        }
    }

【问题讨论】:

  • 我认为在这种情况下你也不需要。
  • 要么一个,要么一个都没有,没关系。唯一重要的是您是否从 被覆盖的方法中调用它。
  • 我用两种方式(base 和 this)都调用了,结果是一样的。
  • 当然,两者都会做同样的事情(这里)。
  • 只要您没有覆盖该方法,就没有差异。一旦你覆盖它,这意味着被覆盖的版本,而 base 意味着父版本。

标签: c# inheritance this base


【解决方案1】:

您只会真正使用基前缀来绕过当前所在的上下文执行的类中本地定义的同名方法。

this.LogData() 的行为与上例中的 LogData() 相同。

base.LogData() 将调用在基类上定义的 LogData,但需要注意的是,在该执行上下文中,LogData 会将 'this' 类视为 'User' 类型类,而不是 '管理类。 这是因为继承模型。 每个“管理员”都可能是“用户”,但并非所有“用户”都是“管理员”。

如果您的执行设法进入基类,则 LogData 方法将只能访问 User 类上的成员 - 因为在那个时间点,Admin 用户已被隐式转换回“User”类方法执行的持续时间。

如上所述 - 有“新”关键字 - 您可以使用禁用与“隐藏”方法相关的警告。 需要注意的是,我认为'new'关键字只是作为一种禁用警告的手段,它实际上并不能促进方法的覆盖。

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/knowing-when-to-use-override-and-new-keywords

如果您希望在派生类中覆盖和创建同名方法,则应在适当的情况下使用 virtual 和 override。 可以在上面的链接中找到有关它们的更多信息。

bc.Method1();  
bc.Method2();  
dc.Method1();  
dc.Method2();  
bcdc.Method1();  
bcdc.Method2();
public override void Method1()  
{  
    Console.WriteLine("Derived - Method1");  
}  


public virtual void Method1()  
{  
    Console.WriteLine("Base - Method1");  
}  


// Output:  
// Base - Method1  
// Base - Method2  
// Derived - Method1  
// Derived - Method2  
// Derived - Method1  
// Base - Method2  

【讨论】:

    【解决方案2】:

    这里是如何从子类调用 Base 方法的示例

    class a
    {
        public void callMe()
        {
            // Base logic
        }
    }
    class b : a
    {
        public new void callMe()
        {
            // This Will call Base method
            base.callMe();
            // Derived Logic
        }
    }
    

    现在请注意 "new" 关键字的使用,它隐藏了基本方法,基本上这是您覆盖方法的方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-03
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多