1

我有一个关于 C# 中简单继承的问题。

这是代码:

  class Mammal
  {
    int age { get; set; }

    public Mammal(int age)
    {
      this.age = age;
    }
  }

  class Dog : Mammal
  {
    string breed { get; set; }

    public Dog(int age, string breed)
    : base(age)
    {
      this.breed = breed;
    }
  }

  class Program
  {
    static void Main(string[] args)
    {
      Dog joe = new Dog(8, "Labrador");
      Console.WriteLine("Joe is {0} years old dog of breed {1}", joe.age, joe.breed); // gives error
    }
  }

这会产生错误,因为它无法访问年龄和品种参数。所以我分别在哺乳动物和狗类中公开年龄和品种。这使得程序运行良好。

但我的问题是,理想情况下不应该将参数设为私有或非公共,并且只能通过公共方法访问吗?如果是这种情况,那么如何访问 Program 类中的非公共参数?

谢谢

4

5 回答 5

5

自动属性本质上是方法(它们被编译为get_set_方法)。通过标记它们public,它们将如您所描述的那样,这很好。

您只需要隐藏外人不应该访问的信息。您的用例表明外部调用者必须有权访问这些属性,因此标记它们public是可以的。

如果您不希望set该值的外部调用者,那么您可以将该特定访问者标记为privateor protected.. 同时让get访问者公开:

public int Age { get; private set; }

此外,将属性中的第一个字母大写。

于 2013-08-23T03:17:32.543 回答
4

在您的代码中,agebreed是属性。您可以通过编写分别控制对get和方法的访问。那会达到你想要的!setpublic get; private set;

此外,请考虑在您的程序中在构建对象后更改对象的年龄和品种是否有意义。如果没有,您可以将它们public readonly设为字段。

于 2013-08-23T03:19:18.753 回答
0

private永远不会在类之外可用,public当您希望所有人都可以访问或protected希望您的属性/变量/方法只能在继承类中访问时,您需要创建它。

于 2013-08-23T03:19:00.610 回答
0

答案how can I access the non-public parameters in Program class是你不能(不做反射),因为你可以控制哪些成员变量、属性和方法暴露给你的派生类和实例化类。

数据封装是一件好事,您应该使用它来降低调用代码能够修改您的类中不应访问的数据的风​​险。

于 2013-08-23T03:22:00.683 回答
0

没有提供访问修饰符,它使用它的默认访问。但是,在大多数情况下,您的逻辑是正确的。你应该尽可能地隐藏。所以在现实中,我可能会根据情况提供publicgetter 和privatesetter - 或不提供。要得到的一点是,只要它提供正确的结果,您就可以自由地做自己喜欢的事情。

在 C# 中,您在这里所拥有的是创建一个始终只能通过其 getter 和 setter 访问的变量(当然是隐含的),因为这确实是最好的实践,尽管不经常实现。

所以在这里:

[访问] [类型] [名称] { [访问]获取;[访问]设置;}

我们能够控制对参数的访问,但可以看到参数本身。你也可以,显然因为你已经做到了,将某些不需要看到的字段设为私有,这是不那么实施的方式。通常,无论访问如何,变量都会采用某种形式的验证,因此使用像上面这样的私有参数对您来说是有利的,因为验证可以放在 setter 中,并允许使用更简单的语法MyClass.Something = somethingElse;or System.Console.Write(MyClass.Something);

于 2013-08-23T03:23:41.423 回答