C #: Может ли _object_ переопределить метод класса? - PullRequest
0 голосов
/ 13 июля 2009

У меня есть образец класса:

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 () уникальным? Спасибо.

Ответы [ 8 ]

11 голосов
/ 13 июля 2009

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

public class ChildClass : SampleClass
{
   private readonly Action someMethodBehavior;

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

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

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

3 голосов
/ 13 июля 2009

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

SampleClass sampleObject = new ChildClass();

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

2 голосов
/ 13 июля 2009

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

Мне кажется, что если вам нужно попытаться сделать что-то подобное, вы идете по неверному пути ...

1 голос
/ 13 июля 2009

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

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

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

1 голос
/ 13 июля 2009

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

0 голосов
/ 13 июля 2009

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

0 голосов
/ 13 июля 2009

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

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

0 голосов
/ 13 июля 2009

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

...