2016-05-11 2 views
1

Мне интересно, есть ли способ переопределить переменную с тем же именем с другим типом в производном классе. Что-то вдоль линий этого (хотя этот код не скомпилируется):Переопределить свойство с тем же именем, но другого типа

public class A 
{ 
    public virtual Point2D Point; // Represent a 2D point 
} 

public class B : A 
{ 
    public override Point3D Point; // Represent a 3D point 
} 

Причиной для этого является то, что A и B могут обмениваться аналогичными свойствами, так что размерность Point отличается.

+1

Только для справки: [Что такое Тень ...] (http://stackoverflow.com/questions/673779/what-is-shadowing) – MrPaulch

ответ

4

Речь идет о Generics.

public class YourBaseClass<T> 
    where T: class 
{ 
    public T Point { get; set; } 
} 

public class A : YourBaseClass<Point2D> 
{ 
} 

public class B : YourBaseClass<Point3D> 
{ 
} 

Так что, когда вы звоните

var a = (new A()).Point; 
var type = a.GetType(); 

тип точки экземпляра A является Point2D (или null в этом примере, так как ссылка набраны свойство еще не инициализирован.)

var point2D = (new A()).Point as Point2D; 

Примечание: причина использования дженериков в этой ситуации - указать тип возврата Point свойство для производных классов.
Использование дженериков - гораздо лучшее решение, чем использование ключевого слова virtual, чтобы скрыть свойство базового класса и определить new один (он же выполняет затенение). Теперь у вас есть базовое свойство, которое имеет «устанавливаемый» тип возврата, вместо того, чтобы иметь несколько свойств, которые скрывают друг друга.

2

Вы не можете переопределить его, но вы можете использовать ключевое слово new, чтобы стимулировать переопределение (затенение).

Примечание: Если ссылка на класс B имеет тип A, вы получите свойство A, а не свойство B.
Это означает, что вы должны быть очень осторожны при использовании нового ключевого слова для свойств базового класса shadowing.

Here is a StackOverflow post о различиях между new и override

Использованием new ключевого слова вместо Переопределения свойств может быть очень полезными, когда производный тип класса свойства является производным от типа свойства базового класса.

+1

В целом, элементы затенения из базовых классов приводят к целому классу новые проблемы, я бы советовал делать это. –

+0

@ LasseV.Karlsen Я согласен Его следует использовать с особой осторожностью, но могут быть очень полезны при правильном использовании. Я добавил разъяснение в свой ответ. –