abstract virtual new

本文对比了C#中虚拟方法与抽象方法的区别,并通过实例演示了如何使用它们。重点介绍了这两种方法的不同应用场景及其实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Here is the program and results, we will see how the virtual and new goes.

public class MyBase
    {
        public virtual string MyVirtualMethod()
        {
            return "Base";
        }

        public string MyNonVirtualMethod()
        {
            return "Base";
        }
    } //end of sub class

    public class MyDerived : MyBase
    {
        public override string MyVirtualMethod()
        {
            return "Derived";
        }

        public new string MyNonVirtualMethod()
        {
            return "Derived";
        }
    } //end of sub class

--------------------------------------------------------------------------------

MyBase m1 = new MyDerived();
Console.WriteLine("MyVirtualMethod='" + m1.MyVirtualMethod() + "', MyNonVirtualMethod='" + m1.MyNonVirtualMethod() + "'");
//    Returns: MyVirtualMethod='Derived', MyNonVirtualMethod='Base'

MyDerived md = new MyDerived();
Console.WriteLine("MyVirtualMethod='" + md.MyVirtualMethod() + "', MyNonVirtualMethod='" + md.MyNonVirtualMethod() + "'");
//    Returns: MyVirtualMethod='Derived', MyNonVirtualMethod='Derived'

----------------------------------------------------------------------------------

the difference bewteen abstract and virtual:

1. abstract method must use in the abstract class, and is required no implement.

2. in the derived class, both of them can be override.

   however, virtual method has other two choice, new and do nothing.

 VirtualAbstract
Has implementationYesNo
Scopemembers onlymembers and classes
Can create an instance ofNot Applicable (you can only create instances of classes, not members)No - but you can create an instance of a class that derives from an abstract class. And you can declare a type Abstract class and instantiate that as a derived class.

 

 

PS:

reference by http://timstall.dotnetdevelopersjournal.com/tips_with_oop__new_virtual_and_abstract.htm

### C# 中 `abstract` 和 `virtual` 关键字的区别及使用场景 #### 定义与特性 - **Virtual 方法**:可以在任意类中定义,具有具体的实现。派生类可以选择重写该方法,也可以继续使用基类的实现[^1]。 - **Abstract 方法**:必须定义在抽象类中,本身没有任何具体实现,强制要求派生类提供自己的实现[^2]。 #### 实现细节对比 | 特性 | Virtual 方法 | Abstract 方法 | |--------------------|-----------------------------------------------|-----------------------------------------| | 是否需要实现 | 提供默认实现 | 不允许提供实现 | | 存放位置 | 普通类或抽象类 | 必须位于抽象类 | | 强制子类覆盖 | 非强制 | 强制 | #### 示例代码比较 以下展示了两种关键字的实际应用差异: ```csharp using System; public class BaseClass { // Virtual method with default implementation public virtual void Display() { Console.WriteLine("Base Class Method"); } // Abstract method must be implemented by derived classes public abstract void Process(); } public class DerivedClass : BaseClass { // Override the virtual method public override void Display() { Console.WriteLine("Derived Class Overridden Method"); } // Implement the abstract method public override void Process() { Console.WriteLine("Processing in Derived Class..."); } } class Program { static void Main(string[] args) { BaseClass obj = new DerivedClass(); obj.Display(); // Calls overridden version from DerivedClass. obj.Process(); // Calls required implementation of abstract method. Console.ReadLine(); } } ``` #### 使用场景分析 - 当设计一个通用功能时,如果某些行为可能不需要改变或者已经有合理默认逻辑,则应采用虚拟函数(`virtual`);这样既提供了灵活性又保留了一定程度上的标准化处理流程[^1]。 - 若某个操作完全依赖于特定类型的内部状态而无法给出有意义的基础版本,并且期望所有继承者都重新定义此动作的话,则应该运用抽象成员(`abstract`)[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值