2014-12-07 4 views
0

У меня есть 3 разных объекта, которые можно назвать: Box, Square, Triangle. Теперь я хочу создать функцию обновления, для которой требуется передать объект. Насколько я знаю, функция будет выглядеть следующим образомИспользование объекта в C#

void Update(Box box, Square square, Triangle triangle) 
{ 
    //do something 
} 

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

void Update() 
{ 
    //do something for Box 
    //do the same for Square 
    //do the same for Triangle 
} 

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

void Update(Object randomObject) 
{ 
    //do something for the randomObject whether its Square, Box or Triangle 
} 
+0

Почему у вас нет метода обновления в каждом классе? Итак, каждый экземпляр может обновить себя? Или вывести три класса из абстрактного базового класса, который заставляет каждый производный класс внедрять метод Update? Вы приближаетесь, кажется, не очень объектно-ориентированным, но вам нужно дать больше контекста. Что это за класс, который может обновить квадрат или треугольник? – Steve

+0

Его класс, который обнаруживает столкновение между этими объектами и игроком. Теперь у меня есть функция внутри класса, которая имеет такой же способ обнаружения столкновения между всеми этими объектами.Проблема в том, что я должен написать один и тот же код 3 раза для каждого объекта, потому что эти объекты не являются одним и тем же типом, и я не могу просто поместить все это в один код и запросить передачу одного объекта. Надеюсь, я объяснил это, это действительно сложно. Во всяком случае, то, что я ищу, является универсальным объектом, который может быть передан как аргумент, и я могу ссылаться на Квадрат, Треугольник или Короб, независимо от того, что мне нужно. –

ответ

1

Вы можете определить общий интерфейс для ваших объектов с помощью базового класса или интерфейс. Для примера, вы могли бы иметь Shape базовый класс с:

public abstract class Shape 
{ 
    // Put common methods here, possibly abstract: 
    public abstract double Area(); 
} 

Затем определить свои конкретные формы, как наследники Shape:

public class Box : Shape 
{ 
    public double Area() { return _width * _height; } 
} 

// etc. 

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

void Update(Shape shape) 
{ 
} 

Аннотация в данном контексте означает, что реализация откладывается до конкретных реализаций, так что вам нужно будет для обеспечения реализации в конкретных классах, примером которой является реализация Area в классе Box, но, конечно, вы также можете определить не абстрактные методы в базовом классе.

0

Да, используйте одну из основных функций программирования OO - Полиморфизм. Ваши три класса должны наследоваться от одного и того же базового класса. В этом обновлении метода реализации класса. Polymorphism

0

Я не знаю ваши детали сценария, но вы можете сделать что-то вроде этого:

void Update(Box box = null, Square square = null, Triangle triangle = null) 
{ 
    if(box !=null) 
    { 
     //Do box update 
    } 
    if(square !=null) 
    { 
     //Do square update 
    } 
    if(triangle !=null) 
    { 
     //Do triangle update 
    } 
} 

и вы могли бы назвать этот метод только для одного или двух объектов

Update(square: mysquare); 

Во всяком случае, если вы могли бы манипулируйте дизайном модели, чтобы все три класса наследовали один базовый класс, было бы лучше.

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