繁体   English   中英

封装 C# 最佳实践

[英]Encapsulation C# Best practices

只是为了澄清和良好的代码实践。 我理解封装的概念,但是您能告诉我这两种代码之间的区别以及您将在哪种情况下使用它们吗? 谢谢。 PS:我不是在寻找链接答案,我只是想要您的诚实意见。

代码 1:

class Program
{
    static void Main(string[] args)
    {
        Car ObjCar = new Car();
        printVehicledetails(ObjCar);
    }

    private static void printVehicledetails(Vehilce vehicle) 
    {
        Console.WriteLine("Here are the Vehicles' details: {0}", vehicle.FormatMe());
    }
}

abstract class Vehilce
{
    protected string Make { get; set; } //here
    protected string Model { get; set; } //here

    public abstract string FormatMe();

}

class Car : Vehilce
{

    public override string FormatMe()
    {

        return String.Format("{0} - {1} - {2} - {3}", Make, Model);
    }
}

代码 2:

class Program
{
    static void Main(string[] args)
    {
        Car ObjCar = new Car();
        printVehicledetails(ObjCar);
    }

    private static void printVehicledetails(Vehilce vehicle) 
    {
        Console.WriteLine("Here are the Vehicles' details: {0}", vehicle.FormatMe());
    }
}

abstract class Vehilce
{
    public string Make { protected get; protected set; } //here
    public string Model { protected get; protected set; } //here

    public abstract string FormatMe();

}

class Car : Vehilce
{

    public override string FormatMe()
    {

        return String.Format("{0} - {1} - {2} - {3}", Make, Model);
    }
}

有一个通用的方法:分离数据和逻辑。 在这种情况下,您应该公开属性(可能使用私有设置器)并将格式放在其他地方,例如,在扩展方法中。

这完全取决于您的上下文,您是否需要从任何派生类外部访问属性。 这是它们的唯一区别,在最后一种情况下,您只能在Vehicle类中访问属性,而在第一种情况下,您可以从任何地方访问它们。

顺便说一句:为属性的 getter 和 setter 提供访问修饰符将导致以下编译时错误。

“无法为属性的两个访问器指定可访问性修饰符......”

然而,以下工作:

protected string Make { get; set; } //here

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM