2014-12-09 2 views
0

Я хотел бы использовать модификатор внутреннего доступа в свойствах Length и Width, но это невозможно. Это вызывает ошибку. Тогда в основном методе невозможно получить значение из этих свойств, когда я хочу использовать метод WriteLine. Вопрос в том, почему? Я нахожусь в том же собрании, или?Такая же сборка, но внутренний accessor вызывает ошибку

namespace AbstractPolygon 
{ 
    abstract internal class Polygon 
    { 
     public double Length { get; protected set; } 
     public double Width { get; protected set; } 

     abstract internal double GetArea(); 
    } 

    internal class Rectangle:Polygon 
    { 
     internal Rectangle(double length,double width) 
     { 
      Length = length; 
      Width = width;   
     } 

     override internal double GetArea() 
     { 
      return Length * Width; 
     } 
    } 

    internal class Square:Polygon 
    { 

     internal Square(double length) 
     { 
      Length = length; 
     } 

     override internal double GetArea() 
     { 
      return Length * Length; 
     } 
    } 

    internal class Program 
    { 
     static void Main(string[] args) 
     { 
      Rectangle objRectangle = new Rectangle(15,5); 
      Square objSquare = new Square(97); 

      Console.WriteLine("Rectangle area of length:{0} and width:{1} is: {2}", 
       objRectangle.Length, objRectangle.Width, objRectangle.GetArea()); 
      Console.WriteLine("Square area of length:{0} is: {1}", objSquare.Length, 
       objSquare.GetArea()); 
     } 
    } 
} 
+0

Какая ошибка? –

+1

Если класс является 'internal', их члены также будут внутренними, даже если они объявлены как' public', так как класс в целом не будет отображаться в другой сборке. –

+0

ok.but точка в том, что я не могу написать: public double Length {INTERNAL get; защищенный набор; } public double Width {INTERNAL get; защищенный набор; } - эти INTERNALS вызывают ошибку - в основном методе eroror пишет, что невозможно получить значение из свойств из-за модификатора доступа - похоже, что класс Polygon и последний класс Program находятся в другой сборке – fio

ответ

1

Вы получаете ошибку компилятора

Доступности модификатор аксессора «AbstractPolygon.Polygon.Length.set» должен быть более строгим, чем свойство или индексатор «AbstractPolygon.Polygon.Length» ,

protected (применительно к инкубатору) означает, что эта сеттер будет видна производными классы, даже если эти классы были в другой сборке, но internal модификатора свойства запрещает это. Модификаторы доступа в сеттере разрешены только для ограничения доступа, но не для его расширения. Вот почему C# жалуется. По-видимому, C# не рассматривает модификатор internal класса при принятии этого решения.

Однако вам не нужно создавать элементы внутри, так как класс (вместе с его элементами) в любом случае не будет видимым в других сборках. Сделайте участников общедоступными, это не угроза безопасности.

+0

Спасибо за пленарное заседание ответ – fio