学习笔记:C# 抽象类与接口(一)

本文介绍了如何在C#中使用抽象类和接口实现车辆模型,通过基类Vehicle和其子类Car、Truck展示如何使用虚方法和开闭原则,以及接口的使用和实现NotImplementedException。

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

学习刘铁锰老师的C#语言入门详解笔记

购买了一个小汽车Car,小汽车有Run和Stop两个方法

class Car {
    public void Run() {
        Console.WriteLine("Car is run!");
    }
    public void Stop() {
        Console.WriteLine("Stopped!");
    }
}

又购买了一个卡车Truck,卡车也同样有Run和Stop两个方法

class Truck {
    public void Run() {
        Console.WriteLine("Truck is run!");
    }
    public void Stop() {
        Console.WriteLine("Stopped!");
    }
}

由于两辆车都具有相同的Stop和Run方法,所以可以创建Vehicle作为基类,将Stop和Run方法放在Vehicle基类中,由于Run这个方法所打印的内容有所不同,所以可以通过添加“参数”的方法进行判别

    class Vehicle {
        public void Stop() {
            Console.WriteLine("Stopped!");
        }
        public void Run(string type) {
            if (type == "Car") {
                Console.WriteLine("Car is run!");
            } else if (type == "Truck") {
                Console.WriteLine("Truck is run!");
            }
        }
    }
    class Car : Vehicle {
    }
    class Truck : Vehicle {
    }

但如果以此为解决方法的话,后期增加其他类型的汽车,对于Run这个方法需要继续增加else if判断,很麻烦,而且违背了“开闭”原则,除了修Bug和增加方法外,不应该去修改类的代码

所以可以使用虚方法,将Vehicle类中的Run方法加上virtual,使得后面继承它的类可以重写这个方法

namespace abstract{
    internal class Program {
        static void Main(string[] args) {
            Vehicle v1 = new Car();
            v1.Run();//The car is running ...
            Vehicle v2 = new Truck();
            v2.Run();//The truck is running ...
        }
    }
    class Vehicle {
        public void Stop() {
            Console.WriteLine("Stopped!");
        }
        public virtual void Run() {
            Console.WriteLine("The vehicle is running ...");
        }
    }
    class Car : Vehicle {
        public override void Run() {
            Console.WriteLine("The car is running ...");
        }
    }
    class Truck : Vehicle {
        public override void Run() {
            Console.WriteLine("The truck is running ...");
        }
    }
}

由于基类Vehicle不会被调用,所以将Vehicle写成抽象类更简洁,抽象类和抽象的方法要加上abstract,注意:抽象类的方法不允许是private

namespace abstract{
    internal class Program {
        static void Main(string[] args) {
            Vehicle v1 = new Car();
            v1.Run();//The car is running ...
            Vehicle v2 = new Truck();
            v2.Run();//The truck is running ...
        }
    }
    abstract class Vehicle {
        public void Stop() {
            Console.WriteLine("Stopped!");
        }
        public abstract void Run();
    }
    class Car : Vehicle {
        public override void Run() {
            Console.WriteLine("The car is running ...");
        }
    }
    class Truck : Vehicle {
        public override void Run() {
            Console.WriteLine("The truck is running ...");
        }
    }
}

 在抽象类上还有更抽象的类,也就是接口,接口的写法如下,接口的命名规则是以大写的“i”开头,例:IVehicle,注意:接口的方法只能是public

namespace interface{
    internal class Program {
        static void Main(string[] args) {
            IVehicle v1 = new Car();
            v1.Run();//The car is running ...
            IVehicle v2 = new Truck();
            v2.Run();//The truck is running ...
        }
    }
    interface IVehicle {
        void Stop();
        void Run();
    }
    class Car : IVehicle {
        public  void Run() {
            Console.WriteLine("The car is running ...");
        }

        public void Stop() {
            throw new NotImplementedException();
        }
    }
    class Truck : IVehicle {
        public  void Run() {
            Console.WriteLine("The truck is running ...");
        }

        public void Stop() {
            throw new NotImplementedException();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值