Mang Irpan Ответов: 2

Концепция класса (класс, обращающийся к свойству, а затем к методу доступа)


Всем Привет

У меня есть класс под названием Автомобиль:
Public Class Car
    'Property
    Public theColor() As Color

    'Method
    Public speed As Double
    Public Function run()
        Return speed
    End Function
End Class


В другом классе я создаю экземпляр класса Car:
Public Class SUV
    Dim newCar As New Car

    Private Sub setColor()
        'set theColor property
        newCar.theColor = Color.Red
    End Sub

    Private Sub testDrive()
        'call run() function
        newCar.run()
    End Sub
End Class


Из приведенного выше кода,
Если я хочу установить свойство класса я просто пишу экземпляр и это свойство:
сайт newcar.цвет = цвет.Красный
Кроме того если я хочу вызвать метод класса я просто пишу экземпляр а затем вызываю функцию или sub:
сайт newcar.запустить()

Но я не понимаю, как может быть такая строка кода, например:
Dim dgv As New DataGridView
dgv.Rows.Add()

Код, приведенный выше, показывают, что экземпляр (dgv) собственность телефону (строки), чем вызвать метод (добавить())


Назад в мой класс (автомобиль и внедорожник)
Как написать код в моем классе, если я хочу вызвать такой метод?

newCar.theColor.resetColor()


И еще один код:
newCar.theColor.setColor() = Color.Red


Мне очень жаль, если название вопроса не совпадает с тем, что я задал.

Спасибо

Что я уже пробовал:

Я понятия не имею, как попытаться решить мой вопрос выше

2 Ответов

Рейтинг:
6

Maciej Los

Я бы настоятельно рекомендовал прочитать о Наследование[^] и Полиморфизм[^].

Один Car класс должен быть базовым классом. Один Suv класс должен наследовать от Car (так как это тип Car). Я прав?

Например:

Public Class Car
	
	Private dc As Integer = 5
	Private c As Drawing.Color = Drawing.Color.Gray
	
	Public Sub New ()
		'default constructor
		
	End Sub
	
	Public Sub New (ByVal doorsCount As Integer, ByVal color As Drawing.Color)
		dc = doorsCount
		c=  color
	End Sub
	
	Public Property DoorsCount As Integer
		Get
			Return dc
		End Get
		Set (ByVal value As Integer)
			dc = value
		End Set
	End Property
	
	Public Property Color As Drawing.Color
		Get
			Return c
		End Get
		Set (ByVal value As Drawing.Color)
			c = value
		End Set
	End Property

End Class

Public Class Suv
	Inherits Car
	
	Public Sub New ()
		'default constructor
		MyBase.DoorsCount = 4
                MyBase.Color = Drawing.Color.Green		
	End Sub
	
	Public Sub New (ByVal doorsCount As Integer, ByVal color As Drawing.Color)
		MyBase.DoorsCount = doorsCount
		MyBase.Color =  color
	End Sub
	
	
End Class



[Правка#1]

Использование:
Dim carcar As Car = New Car()
Console.WriteLine(New String("-", 25))
Console.WriteLine("Car details:")
Console.WriteLine("  - doors: {0}", carcar.DoorsCount)
Console.WriteLine("  - color: {0}", carcar.Color.ToString())


Dim suvcar As Suv = New Suv()
Console.WriteLine(New String("-", 25))
Console.WriteLine("Suv details:")
Console.WriteLine("  - doors: {0}", suvcar.DoorsCount)
Console.WriteLine("  - color: {0}", suvcar.Color.ToString())

suvcar.DoorsCount = 3
suvcar.Color = Drawing.Color.Yellow

Console.WriteLine(New String("-", 25))
Console.WriteLine("Suv details:")
Console.WriteLine("  - doors: {0}", suvcar.DoorsCount)
Console.WriteLine("  - color: {0}", suvcar.Color.ToString())


Результат:
-------------------------
Car details:
  - doors: 5
  - color: Color [Gray]
-------------------------
Suv details:
  - doors: 4
  - color: Color [Green]
-------------------------
Suv details:
  - doors: 3
  - color: Color [Yellow]




[Правка #2]
Как вы можете видеть, Вам не нужен геттер/сеттер внутри пользовательского метода. Вы можете достичь этого, используя только свойства.

Попробуй! Удачи!


Mang Irpan

Я думал, что понял, что такое ООП :D, но на самом деле еще нет.
Спасибо за ваше предложение и пример.

Maciej Los

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

Рейтинг:
16

OriginalGriff

Когда вы пишете это:

Dim dgv As New DataGridView
dgv.Rows.Add(obj)
Вы создаете экземпляр DataGridView, а затем используете его:
dgv.Rows это свойство DataGridView которое возвращает N экземпляр класса DataGridViewRowCollection который является строками в DGV: MSDN[^]
DataGridViewRowCollection имеет метод Add что добавляет строку в коллекцию, а следовательно, и в DGV.
Чтобы сделать что-то подобное, вам понадобится дополнительный класс:
Public Class MyColor
	Public Sub ResetColor()
	End Sub
End Class
Public Class Car
	Public Property TheColor() As MyColor
		Get
			Return m_TheColor
		End Get
		Set
			m_TheColor = Value
		End Set
	End Property
	Private m_TheColor As MyColor
End Class
...
Public Sub myMethod()
	Dim newCar As New Car()
	newCar.TheColor.ResetColor()
End Sub



Цитата:
можем ли мы сделать аналогичный способ создания свойства или метода на другом языке? как java или c#. И является ли это частью концепции ООП? что я пропустил в своем обучении программированию?


Да. Например, вышеизложенное в C# :
public class MyColor
    {
    public void ResetColor()
        {
        }
    }
public class Car
    {
    public MyColor TheColor { get; set; }
    }
...
    public void myMethod()
        {
        Car newCar = new Car();
        newCar.TheColor.ResetColor();
        }

И это похожий код для Java.
Свойства не являются строго частью OOPs - они просто "синтаксический сахар" для задействованных вызовов методов, которые позволяют рассматривать свойство как переменную, - но большинство языков OOPs реализуют их.

Что ты пропустил? : смех: не знаю, меня там не было!


Mang Irpan

Теперь все ясно, спасибо.

Можем ли мы сделать аналогичный способ создания свойства или метода на другом языке? как java или c#. И является ли это частью концепции ООП? что я пропустил в своем обучении программированию?

OriginalGriff

Ответ обновлен.

Mang Irpan

Спасибо за Ваш полезный ответ

OriginalGriff

Пожалуйста!