封装C#最佳实践

时间:2015-06-19 11:42:47

标签: c# encapsulation

只是为了澄清和良好的代码实践。我理解封装的概念,但是你能告诉我这两个代码之间的区别以及你在哪种情况下使用它们。谢谢。 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);
    }
}

2 个答案:

答案 0 :(得分:1)

有一种常见的方法:单独的数据和逻辑。在这种情况下,您应该将属性设置为public(可能使用私有setter),并将格式设置放在其他位置,例如,在扩展方法中。

答案 1 :(得分:0)

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

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

  

“无法为属性的两个访问者指定辅助功能修饰符...”

然而,以下工作:

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