2009-07-13 4 views
0

У меня есть класс образца:C#: Может ли _объект_ переопределить метод класса?

class SampleClass 
{ 
    public virtual string SomeProperty{get; set;} 
    public virtual void SomeMethod() { 
     // code 
    } 
} 

Я могу унаследовать от него и переопределить SomeProperty и SomeMethod как это:

class ChildClass:SampleClass 
{ 
    public override string SomeProperty{get; set;} 
    public override void SomeMethod() { 
     // code 
    } 
} 

Есть ли способ, я могу переопределить из объекта, а не из класс? Как

SampleClass sampleObject = new sampleObject(); 

И у вас есть sampleObject.SomeMethod() быть уникальным? Благодарю.

+0

Что вы имеете в виду переопределение от объекта? sampleObject - это переменная, а не тип, вы не можете создать новую. –

+0

Я не думаю, что инстанцирование собирается даже скомпилировать ... – icelava

ответ

11

Нет, вы не можете переопределить для каждого объекта.Тем не менее, если вы хотите, чтобы различные объекты, различные модели поведения, вы всегда можете передать в качестве делегата конструктору:

public class ChildClass : SampleClass 
{ 
    private readonly Action someMethodBehavior; 

    public ChildClass(Action someMethodBehavior) { 
     this.someMethodBehavior = someMethodBehavior; 
    } 

    public override void SomeMethod() { 
     someMethodBehavior(); 
    } 
} 

Это позволяет каждому объекту эффективно указать свое собственное поведение. Вы даже можете разрешить ссылку нулевого делегата означать «просто выполнить действие по умолчанию», если вы хотите, чтобы это было своего рода переопределение.

+4

LOL Jon, будьте осторожны, насколько хорош ваш ответ. Отвечая на вопрос, как будто это дает двухствольный дробовик новичка для стрельбы из лука! ;-) –

+0

Интересно, может ли это стать возможной с новым динамическим временем выполнения. –

+0

@DrJokepu: Вы бы сделали то же самое с динамическим временем выполнения. Фактически, ExpandoObject позволяет делать именно это, но динамически - вы можете назначить делегат для свойства, а затем выполнить его в другом месте. –

3

Не совсем уверен, что вы пытаетесь достичь, но вы бы просто сделать

SampleClass sampleObject = new ChildClass(); 

Тогда вы могли бы передать sampleObject к любой функции, принявшего SampleClass, несмотря на то, что на самом деле является ChildClass, а так ваши функции виртуальны, ваши переопределенные функции будут вызваны.

2

Нет - вы не можете переопределить объект. На самом деле я думаю, что вы неправильно понимаете, что и объект - объект является экземпляром класса. Объект, в котором он сам не имеет определенных методов и свойств, исходит из класса, к которому принадлежит объект.

Звуки мне, что если вам нужно, чтобы попытаться сделать такую ​​вещь, то вы идете по неверному пути ...

0

Нет, это не возможно в C#. Вам нужно будет создать новый класс с вашим желаемым поведением.

0

класса является основой для его экземпляров ... Почему вы хотите создать объект без его синей печати ...

Всего времени автономной работы ограничивает создать объект без чертежа, однако вы можете использовать объект чтобы получить доступ к его синему принту, и это называется Reflection ... Объект отражает его синюю печать.

1

Ваш вопрос немного неясен, но я думаю, что вы не можете точно сделать то, что хотите - анонимные классы не существуют на C#, как в Java. Вам потребуется создать подкласс класса & для этого экземпляра. Вы можете сделать подкласс приватным в классе, в котором вы объявляете код, таким образом его можно было бы получить только как SampleClass, а не ChildClass

1

Похоже, что вы, возможно, собираетесь что-то не так, и я «Не знаю, почему вы не создали бы дочерний класс с переопределенным методом SomeMethod(), но ...

Единственный способ - явно создать класс с учетом этого, сохраняя свойство делегата. Тогда SomeMethod() вызовет делегат (предположительно установленный при создании объекта).

Делегат по-прежнему не будет иметь доступа к частным или защищенным членам, однако - без какого-либо умного аргумента, проходящего как минимум - так что я действительно не вижу большого смысла.

0

Я думаю, что то, что лучше всего описывает то, что вы притворяетесь, - это анонимные классы на Java. C# хотя, не позволяет вам переопределить метод с анонимным типом, и он не позволяет вам что-либо переопределить.

Смежные вопросы